私の C++ アプリケーションでは、recv
関数をループで使用しています。recv 関数から負の値を取得して、ネットワーク接続の問題を特定したいと考えています。
私のテストで確認できることの 1 つは、ネットワーク ケーブルを外したときに、アプリケーションがこの負の値を取得したことを確認できるまで 1 分ほど待つことができるということです。
ネットワーク接続の問題が発生したことを C++ コードが認識するまでの時間はどれくらいか知っていますか? 今回はなんとかなるかな?
私の C++ アプリケーションでは、recv
関数をループで使用しています。recv 関数から負の値を取得して、ネットワーク接続の問題を特定したいと考えています。
私のテストで確認できることの 1 つは、ネットワーク ケーブルを外したときに、アプリケーションがこの負の値を取得したことを確認できるまで 1 分ほど待つことができるということです。
ネットワーク接続の問題が発生したことを C++ コードが認識するまでの時間はどれくらいか知っていますか? 今回はなんとかなるかな?
C++ コードとは関係ありません。使用している特定のネットワーク プロトコルと関係があります。TCPだと仮定すると、基本的に永遠です。アイドル状態の TCP 接続にはパケットが関連付けられておらず、接続の切断が検出されない場合があります。
特定のインターフェースの喪失を検出したい場合は、プラットフォームのインターフェース状態監視機能を使用してください。
TCP のみのレベルでこれを行う適切な方法はありません。これを目的としたオプションは ですがSO_KEEPALIVE
、かなり役に立ちません。
アプリケーションレベルのハートビートを実装し、指定された時間内にデータまたはハートビートが受信されなかった場合にソケットが切断されたことをマークします (これは、ノンブロッキング モード、または少なくともselect(2)
タイムアウトのあるループを前提としています)。