对于 TCP 套接字上大于 64KB 的数据,如何使用 MSG_DONTWAIT 标志处理 recv()?
How to handle recv() with MSG_DONTWAIT flag for data larger than 64KB on TCP socket?
我想使用 recv 的非阻塞 API 但它在 64KB 数据后不起作用并给出错误:资源暂时不可用。所以我使用 if(error == EAGAIN) 但它卡在接收状态,因为没有可用数据。
while(true) {
ret = recv(csd, buf, size, MSG_DONTWAIT);
if(errno == EAGAIN) {
continue;
}
if (ret < 0) {
perror("Error in receive\n");
close(csd);
exit(EXIT_FAILURE);
} else if (ret == 0) {
fprintf(stderr, "client disconnected\n");
close(csd);
} else {
return buf;
}
}
默认情况下,套接字在内部使用 64k 缓冲区,然后内核拒绝接受更多数据。所以 recv() 可以 return 最多 64kb 的数据而无需等待。
您可以更改套接字的缓冲区大小(man 7 套接字,SO_RCVBUF)或使用循环 select 和 recv 以多次读取它进入更大的缓冲区,因为它变得可用。
我想使用 recv 的非阻塞 API 但它在 64KB 数据后不起作用并给出错误:资源暂时不可用。所以我使用 if(error == EAGAIN) 但它卡在接收状态,因为没有可用数据。
while(true) {
ret = recv(csd, buf, size, MSG_DONTWAIT);
if(errno == EAGAIN) {
continue;
}
if (ret < 0) {
perror("Error in receive\n");
close(csd);
exit(EXIT_FAILURE);
} else if (ret == 0) {
fprintf(stderr, "client disconnected\n");
close(csd);
} else {
return buf;
}
}
默认情况下,套接字在内部使用 64k 缓冲区,然后内核拒绝接受更多数据。所以 recv() 可以 return 最多 64kb 的数据而无需等待。
您可以更改套接字的缓冲区大小(man 7 套接字,SO_RCVBUF)或使用循环 select 和 recv 以多次读取它进入更大的缓冲区,因为它变得可用。