ノンブロッキングソケットの場合、リモートクライアントが正常に切断されている場合(サーバーであると仮定して)、recv()
はエラーコードなしで0を返します。異常切断をどのように検出しますか? recv()
は依然として0を返しますか、これを検出するためにAPIを使用する別の方法がありますか?winsock2の異常切断を検出する方法は?
答えて
接続が物理的に切断されている場合や、ソケットを正常に閉じずに他のホストがシャットダウンした場合は、recv
は永遠に待機します。ソケットレベルでは、select()
を使用し、待機中のデータをソケットで読み取るためのタイムアウトを設定できます。これをループで行い、データがある場合はそれを読んでください(recv()
); select()
がタイムアウトした場合は、ソケットを正常に閉じて再接続してください。
もう1つの解決策は、あなたのプロトコルにキープアライブを実装していることです。一方の側ではキープアライブメッセージが定期的に送信され、もう一方の側にはタイムアウトセット(送信期間に合わせて)が設定されたタイマーがあり、待機中です。タイマーがタイムアウトすると、「待機中」のホストはソケットを閉じて再接続を試みます。
良い点 - それはOPが「異常な切断」によって何を意味するのか、彼/彼女は長い、長い時間を待っている可能性があります.. –
recv()のMSDNをご覧ください。すべてが明らかになる!
「異常切断」<>切断されていないことに注意してください!ネットワークケーブルがピアから脱落してデータを送信しようとしない(つまりデータを待っている)場合は、@ Bojanによって指摘されているように、永遠に待つことができます –
私の質問をより詳しく検討してください。私は異常な切断(または非優雅な切断)について尋ねました。 recv()ドキュメントは、_graceful_切断中に0を返します。 –
「離れている」サーバーは、クライアントのPOVからの異常な切断ではありません。 WSAECONNRESET、WSAETIMEDOUTまたはWSAECONNABORTEDは、WSAGetLastError()によって返されるような異常な切断であり、recv()はSOCKET_ERRORで返されます。半接続が異常切断されることはありません。 –
- 1. TCP接続の切断を検出する方法は?
- 2. PHPクライアントからフラッシュクライアントの切断を検出する方法は?
- 3. QSqlDatabase切断検出
- 4. TCPソケットの切断状態を検出する方法
- 5. WCFサービスがクライアントの切断を検出する方法
- 6. Jersey ChunkedOutput - クライアントの切断を検出する方法
- 7. ネットワークストリームが切断を検出する方法
- 8. Cでソケット切断を検出する方法
- 9. PHP - リモートホストの切断を検出する
- 10. USBデバイスの接続/切断時の検出方法は?
- 11. H2O-Rで異常検出のモデルを作成する方法
- 12. データベースの異常値データポイントを検出する方法
- 13. プレディクスの異常検出にアナリティックを実行する方法
- 14. Python SocketServer.TCPServerでクライアント切断を検出する方法はありますか?
- 15. R異常検出ベクトル(パラメータ「期間」を決定する方法)
- 16. Fayeさんとのチャンネルで切断イベントを検出する方法
- 17. オーディオデバイスの到着/切断の検出
- 18. EJBデータソースクライアントの切断の検出
- 19. ラチェットウェブソケット - 切断されたクライアントを検出
- 20. Netty:切断を検出するのに `IdleStateHandler`を使用する
- 21. AndroidはすぐにBluetoothの切断を検出します
- 22. 切断ユーザ信号で検出
- 23. Android 2.1 Bluetoothオーディオの接続/切断を検出する
- 24. java httpclientサーバの切断を検出する
- 25. Cでの非gracefull切断を検出する
- 26. Socket.ioは切断理由を検出します
- 27. QGamepadManagerはubuntuでコントローラの切断を検出しません
- 28. Three.jsでキューブを切断する方法
- 29. Hibernateセッションを切断する方法
- 30. Javaソケット - 入力ストリームなしでネットワーク切断を検出する
recv()のMSDNをご覧ください。すべてが明らかになる! –