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:
43
server.c
43
server.c
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user