目標は、ブロックせずにソケットからデータを読み取ることです。Linuxのマニュアルページには次のように書かれています:
受信呼び出しは通常、要求された全量の受信を待つのではなく、要求された量までの利用可能なデータを返します。
/ /でソケット記述子をポーリングした後にMSG_DONTWAIT
フラグを渡す必要がないということですか?recv()
select()
poll()
epoll()
recv
/の動作はread
、ソケット自体の特性に依存します。ソケットが非ブロックとしてマークされている場合、これらの呼び出しは、プロセスをブロックするのではなく、すぐにEAGAIN
/を返す必要があります。EWOULDBLOCK
fcntl
ソケットは、通常はまたはを介して、読み取る前に非ブロッキングとしてマークできますioctl
。
マニュアルからのこの抜粋は、基本的に、提供されたバッファ全体を満たすために、ブロッキングソケットと非ブロッキングソケットの両方での読み取りは必要ないということです。recv
そのため、 /read
呼び出しの結果をチェックして、実際のデータが含まれているバッファの量とゴミがどれくらいあるかを知ることが重要です。
select
//などの IO ポーリング呼び出しpoll
と組み合わせてブロッキング ソケットを使用することは、まったくお勧めできませんepoll
。ポーリング呼び出しが特定のソケットが読み取りの準備ができていることを示している場合でも、ブロッキング ソケットが依然としてブロックされることがあります。