サーバーとの接続が失われたかどうかを確認するにはどうすればよいですか?(クライアント側またはサーバー側に関係なく)TCP接続を使用しており、サーバーの受信によりクライアントの制限が解除されます。クライアントごとに、サーバーはスレッドを作成します。そうすることで、クライアントごとに受信/送信できます。
4 に答える
1 つのオプションとして、ソケットでTCP キープアライブ オプションを使用することを検討できます。
しかし、多くの NAT およびステートフル ファイアウォールは、一定時間内にアクティビティが観察されない場合、実際には TCP 接続をドロップします。また、このアクティビティ タイムアウトは、TCP でサポートされている定期的なキープアライブ メッセージよりも速い場合があります。このため、通常、30 ~ 60 秒ごとにサーバーにプロトコル メッセージを送信するだけで、NAT に関して接続を「有効」に保つことができます。
私の個人的な見解はこれです。接続が長時間実行されることを意図している場合、「私はまだここにいる」ことをサーバーに通知するのはクライアントの責任です。サーバーは定期的にウェイクアップし、最後の N 秒間トラフィックがなかった TCP 接続を閉じる必要があります。(ここで、N はアプリケーションにとって妥当な値です)。あなたの場合、「クライアントごとのスレッド」アプローチは、各スレッドがリモートクライアントがいつ応答しなくなったかを判断するだけでよいことを意味します。
プロトコル内で、クライアントは独自のカスタム「ping」メッセージを 30 ~ 60 秒ごとにサーバーに送信できます。サーバーは常にこのメッセージを確認し、クライアントがまだ存在していることを記録します。
私が話していることの多くは、プロトコル、サービスの機能、および接続が持続することが予想される時間に大きく依存します。
アプリケーションでping システムを構築します。
非同期または同期の受信呼び出しを常に未解決のままにしておきます (多くのアプリは設計上これを行います) - 接続が失われると、特定の受信 API に応じて失敗状態で完了します。
ソケットがもう接続されていない場合は、send()
リターンSOCKET_ERROR
とWSAGetLastError()
リターンWSAENOTCONN
、またはその他の関連エラー。
データの読み取りrecv()
中にゼロが返された場合、ピアは正常なシャットダウンを実行しています。
接続されていないソケットから読み取っている場合は、recv()
リターンSOCKET_ERROR
とWSAGetLastError()
リターンWSAENOTCONN
、またはその他の関連するエラーが発生します。
WinSock エラー コードは、MSDN に記載されています。