1

如果我将套接字设置为非阻塞,如果没有要读取的新数据,我应该从 recv() 得到什么?

目前,我正在使用 if 语句来查看是否收到大于 -1 的内容。但如果什么也没收到,它似乎会以某种方式阻塞。这就是我的代码的样子:

flags = fcntl(newfd, F_GETFL);
flags |= O_NONBLOCK;
fcntl(newfd, F_SETFL, flags);

while(1){
...
... 
if( (recvBytes = recv(newfd, recvBuf, MAXBUFLEN-1, 0)) > -1) {
 ...
     }

}
4

2 回答 2

4

根据我的手册页:

如果套接字上没有可用的消息并且在套接字的文件描述符上没有设置 O_NONBLOCK,则 recv() 将阻塞直到消息到达。如果套接字上没有可用的消息并且在套接字的文件描述符上设置了 O_NONBLOCK,recv() 将失败并将 errno 设置为 [EAGAIN] 或 [EWOULDBLOCK]。

于 2013-08-23T14:40:15.563 回答
2

我建议进行以下表面上的改变。它不会改变代码的逻辑,但它确实让测试的内容、时间和目的变得非常清晰。

int response;
...
while(1){
  ...
  response = recv(newfd, recvBuf, MAXBUFLEN-1, 0);
  if (response <= 0)
  {  // assuming that a zero or negative response indicates
     // test errno for EAGAIN or EWOULDBLOCK per JB comment
   ...
  } else {
    // response contains number of bytes received..
  }

 ...
} // end while

一个好的编译会将赋值和 if 语句优化为您最初编写的内容。所以这种编码风格是为了方便思考代码的作用。

于 2013-08-23T17:57:49.883 回答