2010-12-20 17 views
0

私はクライアント/サーバーアプリケーションを持っています。クライアントをサーバーの一方の端に接続するストリームを閉じるとき、他方の端にクライアントを接続するときに(ローカル環境のLANで) (つまり、私のクライアントでは、クライアントをサーバに接続するストリームを閉じ、サーバの反対側では、それが目立ち、サーバストリームを囲むtry-catchブロックの例外として報告されますコード)。ストリームが閉じられたときにシグナルが送信される

どうすれば可能ですか?クライアント/サーバーは、ストリームを閉じる直前にストリームが閉じられている特定のコードを送信しますか?それは広いネットワーク(大規模WANなど)でも適用可能ですか?

大きな問題は、一方の端でストリームを閉じるときに、もう一方の端で気付かれ、そのスレッドを閉じて、決して無限に待つことなくデータを受け取るという事実に頼ることができますそのストリームは閉じているという事実のために来る?

クライアントとサーバの間の最大距離は700キロ(それが役割を果たしている場合、私は知らないが、私は念のためにそれを言及した)

感謝です!

答えて

3

TCPでは、connection shutdown procedureには確かに相手側に追加のデータグラムを送信する必要があるため、各側は接続が正常にシャットダウンされたことに気付きます。

これに依存することには、決定的ではないシャットダウン(ネットワークケーブルの物理的切断など)の場合、通知は送信されません。 TCPには、接続がまだ生きているかどうかにかかわらず定期的にpingを行う「キープアライブ」機能がありますが、pingの頻度が非常に低い(数時間のオーダー)のであまり実用的ではありません。 「ほとんどの」接続が正常なシャットダウン(システムが稼働している限りクライアントアプリケーションのクラッシュを含む)を参照する場合、シャットダウン通知に頼るのは妥当です。通常、サーバーソフトウェアは、安全な側だけに接続するためにタイムアウトをかけます。

+0

私のクライアントからデータを送信しようとすると接続が閉じられていますが、クライアントが未知の要因によって接続が切断されたことが通知されていない場合、クライアントはデータ送信されていませんでしたか? – Alex

+0

サーバー・マシンがオンであると仮定すると、クローズされた接続にデータを送信すると、「接続のリセット」というエラー・メッセージが表示されます。ホストが停止している場合は、ICMPエラーメッセージが表示されることがあります。メッセージがまったく認識されない場合、ローカルTCPスタックはタイムアウト後にエラーを生成します。 –

関連する問題