ノンブロッキング ソケットでの select()、recv()、および EWOULDBLOCK

recv() の場合 EAGAIN を取得します EWOULDBLOCK ではなく 、はい、可能です。 select() でチェックしたばかりなので その後、次の 2 つのうちのいずれかが起こりました:

  • 他の何か (別のスレッド) が select() の間に入力バッファを空にしました および recv() .
  • ソケットに受信タイムアウトが設定されましたが、データが受信されずに期限切れになりました。

可能ですが、複数のスレッド/プロセスが同じソケットから読み取ろうとしている状況でのみ可能です。


O_NONBLOCK で動作する一般的なデスクトップのエラーを認識しています TCP ソケット、特にループバック インターフェイスで実行されているソケットは、EAGAIN を返すことがあります。 recv() から select()以降 ソケットが読み取りの準備ができていることを報告します。私の場合、これは相手側が送信ストリームを半分閉じた後に発生します。

詳細については、t_nx.ml のソース コードを参照してください。 私の OCaml Network Application Environment ディストリビューションの NX ライブラリにあります。 (リンク)