0

ノンブロッキング ソケットのrecv()場合、リモート クライアントが正常に切断された場合 (私たちがサーバーであると仮定します)、エラー コードなしで 0 が返されることがわかっています。異常な断線をどのように検出しますか? それでも 0 を返しますrecv()か、それとも API を使用してこれを検出する他の方法はありますか?

4

2 に答える 2

2

接続が物理的に切断された場合、またはソケットを適切に閉じずに他のホストがシャットダウンした場合、recv永遠に待機することになります。ソケット レベルでは、select()タイムアウトを使用して、ソケットでの読み取りに使用できるようになるまでデータを待機するように設定できます。これはループ内にあり、データが利用可能な場合は読み取ります ( recv()); タイムアウトした場合select()は、ソケットを正常に閉じて再接続します。

別の解決策は、プロトコルにキープアライブを実装することです。一方はキープアライブ メッセージを定期的に送信し、もう一方はタイムアウトが設定された (送信期間に合わせて調整された) タイマーを持ち、それらを待機しています。タイマーがタイムアウトすると、「待機中」のホストはソケットを閉じて再接続を試みます。

于 2012-04-17T18:23:06.873 に答える
-2

recv() については MSDN を参照してください。すべてが明らかになります!

于 2012-04-17T18:12:26.043 に答える