我接受了一个非阻塞连接套接字:
我有一个非阻塞套接字连接,在收到一包数据后,我try 使用recv读取更多内容.
struct sockaddr accepted_address;
socklen_t accepted_address_size = sizeof(accepted_address);
int fd = accept(server_fd, &accepted_address, &accepted_address_size);
make_nonblocking(fd);
... // wait when socket is ready to give me data
char buffer[BUF_SIZE];
int used = 0;
while (true) {
int bytes_received = recv(fd, buffer, BUF_SIZE, 0);
if (bytes_received > 0) { /* OK */ }
else if (bytes_received < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
/* Should wait for more data, BUT I WILL WAIT INDEFINITELY!!! */
} else {
/* Handle error */
}
} else {
/* EOF, OK, Process received data */
}
}
当第一个recv调用检索到整个消息时,问题就出现了,但后续调用的结果是errno == EAGAIN
,这导致了对更多永远不会到达的数据的无限期等待.
按每this answer 这是意料之中的行为.
我的问题是: How can I reliably determine that I have received the entire message if the second call to recv won't give me EOF but instead returns EAGAIN, leaving me waiting indefinitely?个