2

目標は、ブロックせずにソケットからデータを読み取ることです。Linuxのマニュアルページには次のように書かれています:

受信呼び出しは通常、要求された全量の受信を待つのではなく、要求された量までの利用可能なデータを返します。

/ /でソケット記述子をポーリングした後にMSG_DONTWAITフラグを渡す必要がないということですか?recv()select()poll()epoll()

4

1 に答える 1

4

recv/の動作はread、ソケット自体の特性に依存します。ソケットが非ブロックとしてマークされている場合、これらの呼び出しは、プロセスをブロックするのではなく、すぐにEAGAIN/を返す必要があります。EWOULDBLOCK

fcntlソケットは、通常はまたはを介し​​て、読み取る前に非ブロッキングとしてマークできますioctl

マニュアルからのこの抜粋は、基本的に、提供されたバッファ全体を満たすために、ブロッキングソケットと非ブロッキングソケットの両方での読み取りは必要ないということです。recvそのため、 /read呼び出しの結果をチェックして、実際のデータが含まれているバッファの量とゴミがどれくらいあるかを知ることが重要です。

select//などの IO ポーリング呼び出しpollと組み合わせてブロッキング ソケットを使用することは、まったくお勧めできませんepoll。ポーリング呼び出しが特定のソケットが読み取りの準備ができていることを示している場合でも、ブロッキング ソケットが依然としてブロックされることがあります。

于 2013-02-28T13:06:58.177 に答える