2012-04-17 20 views
0

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

+0

recv()のMSDNをご覧ください。すべてが明らかになる! –

答えて

2

接続が物理的に切断されている場合や、ソケットを正常に閉じずに他のホストがシャットダウンした場合は、recvは永遠に待機します。ソケットレベルでは、select()を使用し、待機中のデータをソケットで読み取るためのタイムアウトを設定できます。これをループで行い、データがある場合はそれを読んでください(recv()); select()がタイムアウトした場合は、ソケットを正常に閉じて再接続してください。

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

+0

良い点 - それはOPが「異常な切断」によって何を意味するのか、彼/彼女は長い、長い時間を待っている可能性があります.. –

-2

recv()のMSDNをご覧ください。すべてが明らかになる!

+0

「異常切断」<>切断されていないことに注意してください!ネットワークケーブルがピアから脱落してデータを送信しようとしない(つまりデータを待っている)場合は、@ Bojanによって指摘されているように、永遠に待つことができます –

+0

私の質問をより詳しく検討してください。私は異常な切断(または非優雅な切断)について尋ねました。 recv()ドキュメントは、_graceful_切断中に0を返します。 –

+0

「離れている」サーバーは、クライアントのPOVからの異常な切断ではありません。 WSAECONNRESET、WSAETIMEDOUTまたはWSAECONNABORTEDは、WSAGetLastError()によって返されるような異常な切断であり、recv()はSOCKET_ERRORで返されます。半接続が異常切断されることはありません。 –

関連する問題