使用非阻塞套接字时recv()返回什么?

时间:2013-08-23 14:36:50

标签: c sockets

如果我将套接字设置为非阻塞,如果没有要读取的新数据,我应该从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) {
 ...
     }

}

2 个答案:

答案 0 :(得分:4)

根据我的联系方式:

  

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

答案 1 :(得分: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语句,使其成为您最初编写的内容。因此,这种编码风格可以让您轻松思考代码的作用。