1
0
mirror of https://github.com/fumiama/simple-kanban.git synced 2026-06-27 14:40:27 +08:00

fix(server.c): recv paused bue to MSG_WAITALL

This commit is contained in:
源文雨
2023-12-01 11:24:24 +09:00
parent 651df6e390
commit 363dcb535d

View File

@@ -336,36 +336,27 @@ static int s3_set_data(tcpool_thread_timer_t *timer) {
file_size -= p; file_size -= p;
printf("Copy received data: %zd bytes, remain: %u bytes\n", p, file_size); printf("Copy received data: %zd bytes, remain: %u bytes\n", p, file_size);
} }
if((uint64_t)file_size <= (uint64_t)recv_bufsz) { puts("Start loop recv");
if((recvlen = recv(timer->accept_fd, fc->data+p, (size_t)file_size, MSG_WAITALL)) != (ssize_t)file_size) { while((recvlen = recv(
*(uint32_t*)ret = *(uint32_t*)"ercA"; timer->accept_fd, fc->data+p,
(size_t)(((uint64_t)file_size>(uint64_t)recv_bufsz)?recv_bufsz:file_size), 0)
) > 0) {
if(recvlen <= 0 || (uint32_t)recvlen > file_size) {
*(uint32_t*)ret = *(uint32_t*)"ercM";
perror("recv"); perror("recv");
goto S3_RETURN; goto S3_RETURN;
} }
printf("Recv from client: %zd bytes\n", recvlen); file_size -= (uint32_t)recvlen;
} else { p += recvlen;
puts("Start loop recv"); printf("Loop recv from client: %zd bytes, remain: %u bytes\n", recvlen, file_size);
while((recvlen = recv( if(file_size == 0) break;
timer->accept_fd, fc->data+p,
(size_t)(((uint64_t)file_size>(uint64_t)recv_bufsz)?recv_bufsz:file_size), MSG_WAITALL)
) > 0) {
if(recvlen <= 0 || (uint32_t)recvlen > file_size) {
*(uint32_t*)ret = *(uint32_t*)"ercM";
perror("recv");
goto S3_RETURN;
}
file_size -= (uint32_t)recvlen;
p += recvlen;
printf("Loop recv from client: %zd bytes, remain: %u bytes\n", recvlen, file_size);
if(file_size == 0) break;
}
if(recvlen <= 0) {
*(uint32_t*)ret = *(uint32_t*)"ercF";
perror("recv");
goto S3_RETURN;
}
puts("Finish loop recv");
} }
if(recvlen <= 0) {
*(uint32_t*)ret = *(uint32_t*)"ercF";
perror("recv");
goto S3_RETURN;
}
puts("Finish loop recv");
S3_RETURN: S3_RETURN:
pthread_cleanup_pop(1); pthread_cleanup_pop(1);
return send_data(timer->accept_fd, ret, 4); return send_data(timer->accept_fd, ret, 4);