2013-08-23 51 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