2016-04-14 8 views
0

サーバーがクライアントにデータを送信し、クライアントがデータを返すサーバー/クライアントアプリケーションを作成しようとしています。しかし、何らかの理由で、データを書き込まずに非正常な切断を検出する方法を知っていないので、私はそれを動作させることができません(バッファは不必要なデータで満たされるのでデータを書き込めません)。それを行う別の方法がありますか?私はTCPを使用しています。Cでの非gracefull切断を検出する

+1

TCPは接続停止を正常に処理するように設計されています。消滅した接続から回復するTCPの機能は機能であり、バグではありません。別の言い方をすると、通信が行われていない場合、切断されていないことです。もう一方の側がまだ生きているかどうかを知る必要があるときのこれまでの解決方法は、プロトコルに定期的なハートビートを組み込むことです。そのような操作がない場合、ゼロバイト書き込みを使用することがありますが、これは完全には信頼できません。 –

答えて

0

信頼性の低いネットワーク上のTCP接続の動作について説明します。したがって、他のプロトコルを使用する必要があります。私は問題を完全に理解していない

TCP C#

+0

信頼できるネットワークですが、サーバーが切断された場合は、すべてのクライアントを手動で再接続したくありません。 –

+0

あなたはどのプロトコルを使用していますか? –

+0

申し訳ありませんが私はあなたの答えを誤解しました。私は既にTCPを使用しています。 –

0

を見て、しかし、あなたはあなたのソケットがまだ接続されているかどうかを確認できます。

public bool IsSocketConnected(Socket socket) { 
    return !(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0) && socket.Connected; 
} 
+0

ありがとうございます。これは優雅な切断のために機能します。しかし、非優雅な切断のためではありません。 (サーバーネットワークがランダムに切断されたとき) –

+0

タイムアウト(この例のように「0」以外)を選択することは、実用的な解決策になる可能性があります。切断が偶然起こった場合、「生き残っている」側は、状態を変更するためのワードを受け取る(切断された側からそのワードが来なければならない)ことができないか、タイムアウトメカニズムが導入されています。 – kasperhj

0

私はキープアライブとそれを修正しました関数。

関連する問題