1

ソケットをノンブロッキングに設定した場合、読み取る新しいデータがない場合、recv() から何を取得する必要がありますか?

現在、and 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) {
 ...
     }

}
4

2 に答える 2

4

私のマンページによると:

ソケットで利用可能なメッセージがなく、ソケットのファイル記述子に O_NONBLOCK が設定されていない場合、recv() はメッセージが到着するまでブロックします。ソケットで利用可能なメッセージがなく、ソケットのファイル記述子に O_NONBLOCK が設定されている場合、recv() は失敗し、errno を [EAGAIN] または [EWOULDBLOCK] に設定します。

于 2013-08-23T14:40:15.563 に答える