2013-08-23 50 views
0

如果我将套接字设置为非阻塞,那么如果没有新数据要读取,我应该从recv()中获得什么?使用非阻塞套接字时,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

对'fcntl()'的调用是否成功了?看起来好像你在测试这个。 – alk

回答

3

根据我的手册页:

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

1

我会建议以下的表面变化。它并没有改变你的代码的逻辑,但它确实清楚了什么是被测试的,什么时候以及为了什么。

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 

一个好的编译将优化任务,并且如果语句变成了像你最初写的东西。所以这种编码方式是为了让人们很容易思考代码的功能。

+1

当文档存在时,不需要“假设”。零和否定响应是需要分开处理的两种不同条件。 – EJP

+1

如果'recv()'返回'0',这意味着另一端有连接“有序关闭”。 – alk