繁体   English   中英

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

[英]What does recv() return when using non-blocking 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) {
 ...
     }

}

根据我的手册:

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

我建议进行以下肤浅的改变。 它不会改变代码的逻辑,但确实可以清楚地说明正在测试的内容,时间和用途。

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语句,使其类似于您最初编写的内容。 因此,这种编码方式使思考代码的工作变得容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM