簡體   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