我想使用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()最多可以返回64kb的数据,无需等待。
您可以更改套接字的缓冲区大小(man 7 socket,SO_RCVBUF),或者使用 select 和 receive 周围的循环,在可用时将其多次读取到更大的缓冲区中。
关于c - 对于 TCP 套接字上大于 64KB 的数据,如何使用 MSG_DONTWAIT 标志处理 recv()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50962793/