2016-11-29 5 views
-1

私はWinsock2を使用しています。私はIPv4よりもTCPソケットを作成しました。相手側がネット接続を失った場合、どのようにクライアント/サーバー側から検出できますか?

私は片側が接続を閉じているかどうかを検出する方法を知っていますが(recv関数の値をチェックしています)、側がインターネット接続を失った場合はどうなりますか?

クライアントとサーバーの両方がもう一方の側を検出できない場合は、この方法でネットワークに接続できなくなります。

+1

ハートビートを使用する必要があります。クライアントまたはサーバーが送信を停止すると、相手側に問題があると想定することができます。 – Rama

+0

私を良く説明できますか?それはKEEP_ALIVEオプションに関するものですか? – Serusar

+0

ハートビートは、サーバーとクライアントの間で定期的に送信される一部のデータで構成され、相手側が確実に動作するようにします。簡単なタグメッセージといくつかのタイマーロジックで実装することができます。 – Rama

答えて

0

少なくともその質問をする前に、OSIモデルについて学ぶ必要があるかもしれません。 TCP、IPv4にはメディア(イーサネット、インターネット)と共通のものはなく、カプセル化されています。あなたが意味していたのは、接続が切断された場合(いわゆるハーフオープン接続)のケースでした。 TCPは、スリーウェイハンドシェークプロセスと4ウェイ接続クロージャを使用します。接続が確立された後、いずれの側からもデータが送信されない場合、使用される媒体は何も交差しない。 TCPはアイドルプロトコルであり、そのレベルでは、クライアントからサーバーへの "ハートビート"メッセージは送信されません。

TCPは、弾力性と効率性のためにこの方法で設計されており、ケーブルを抜き差しし直すことができます。この設計は、接続がまだ存在するかどうかを確認するためだけに、ネットワーク上で「ポーリング」パケットが送信されないため、効率的です。なぜそれが実生活でいつも働くとは限らないのですか?通常、接続の再初期化後、クライアント側にDHCPを介して新しいIPが割り当てられているか、またはすでにタイムアウトしてその接続がマークされているためです。サーバーはどのようにそれをするのですか?クライアントがあまりにも長くアイドル状態になると、接続は安全に終了すると考えられます。クライアントソフトウェア通常は、必要に応じてすぐにセッションを再確立するように設計されています。セッションフローに厳しい制限が必要なアプリケーションレベルのプロトコルでは、キープアライブパケットとも呼ばれる何らかの定期的なハートビートパケットを使用します。 ICMPプロトコルクライアントまたはサーバかもしれませんが、ICMPがNATルータや一部のファイアウォールによってブロックされる可能性があるなど、制限があります。

ハートビートとタイムアウトがパートfプロトコルでない場合の古典的な例があります:FTP。 2つの接続として設計されています.1つは「コマンドチャネル」で、もう1つはデータ転送用です。クライアントプールを使い切らないために、FTPサーバーは通常、コマンドが一定時間以上送信されないとデータ接続を終了します。クライアントが大きなファイルを "取得"するとどうなるでしょうか?転送が終了する前にサーバーが転送を切断することがあります。それは、クライアントからのログインに応答してデータ接続を作成するサーバー側である「パッシブ」FTPによって解決できます。クライアントが接続を受け取れず、ルータの後ろにいれば、それは可能ではないかもしれません。他の解決策は、クライアントが、例えば "PWD"(現在のフォルダを取得する)のように、トラフィックをほとんど引き起こさない "ダミーの"コマンドを定期的に送信することでした。

ハーフオープン接続の話題がたくさん書かれていますので、あなた自身で決定する必要があります。どのデザインが望ましいかを判断してください。

+0

私はそれらをすべてteoretically知っていますか?私はOSIモデルの仕組みを知っています。私はTCPの仕組みを知っています。私はこの状況をCODEする方法を尋ねました。半開きの接続を処理するために何かが必要です。どのようにWinsock2を使ってC++でこれを行うことができますか?私はこれを実装する方法を理解できません。クライアントが接続を切断すると、サーバー側で検出する必要があります。ソケットを閉じてプログラムから終了したいからです。 – Serusar

+0

ハーフオープン状態の検出を含む、クライアントとサーバーの間でどのようなプロトコルを使用するのかを草案する必要があります。石のワークフローやパターンには、特にライブラリの代わりに純粋なAPIを使用している場合は特にありません。 – Swift

+0

@Serusarプロトコルの一部として、ソケットにはほとんど使用されないオプションがあります。https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs) .85).aspx – Swift

関連する問題