私は自分のプロジェクトに async io を使用し、開いている各ソケットからフレームごとにデータを読み取ろうとする単一のスレッド ループを実行することにしました。これは非常にうまく機能し、全体として今のところ満足しています。問題は、非同期ソケットで発生している奇妙な問題です。
次のようなコードがあります。
accept a connection...
fcntl(O_NONBLOCK) on the client socket...
int rc;
if((rc = recv(socket))>0)
process data
if rc == 0
close socket and cleanup
問題は、接続が閉じられていないことを知っていても、時々 rc == 0 になることです。クリーンアップしなければ、アプリは通常どおり動作します。しかし、クリーンアップを行うと、クライアントは接続が確立される前に切断を受け取ります。
だから私の質問は:ソケットから正しい戻り値を取得するために、recvを実行する前にソケットの準備ができているかどうかを何とかチェックする必要がありますか?
私が見つけた情報のほとんどは決定的なものではありませんでした。select() への参照を見つけましたが、ソケットのステータスが変更されるまでブロックされているようですが、ソケットを非ブロックにする必要があります。
私が探しているのは、データがある場合はバッファに読み込まれ、recv は読み込まれたバイト数を返し、データがない場合は -1 を返し、ソケットが切断されている場合は返す必要があるという直感的な動作です。 0.
recv を呼び出して期待どおりに動作させる前に、ソケットに対して他に何かする必要がありますか?