我想使用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;
}
}
答案 0 :(得分:1)
默认情况下,套接字内部使用64k缓冲区,然后内核拒绝接受更多数据。因此recv()最多可以返回64kb的数据,而无需等待。
您可以更改套接字(man 7套接字,SO_RCVBUF)的缓冲区大小,或在select和recv周围使用循环,以在可用时将其读入更大的缓冲区中。