これはどうやって行うのかという質問ではありませんが、私がやっていることが間違っているかどうかについての質問です。私は、タイマーや定期的に送られてきたメッセージなどを使わずに、データ(BeginReceive)を待っている間に、ソケットが予期せず閉じられたかどうかを検出することはできません。私はこれを行うために以下の設定を使用していましたが、これまでは完全に機能していました。予期しないソケット切断の検出
public void OnReceive(IAsyncResult result)
{
try
{
var bytesReceived = this.Socket.EndReceive(result);
if (bytesReceived <= 0)
{
// normal disconnect
return;
}
// ...
this.Socket.BeginReceive...;
}
catch // SocketException
{
// abnormal disconnect
}
}
私はそれが容易ではないことを読んだので、私の方法に何か問題があるかどうか疑問に思っています。ある?あるいは、プロセスを殺してケーブルを引っ張るなどの違いがありますか?
+1私はあなたが「そうするようにプログラムされているか」をどのように記述するのが好きだからです。 –
+1また、それが再スローされない限り、すべてをキャッチするcatchステートメントを決して持つべきではないことを指摘したいと思います。 –
@Alex私はあなたがそれらを転覆しない限り、すべての例外をキャッチすることの禁止に同意しない。 私はTCPサーバクラスを持っています。このクラスはここでのように非常によく動作します。サーバアプリケーション全体を終了させるためにいくつかのランダム例外を必要としません。 これは、すべての例外を捕捉し、OnExceptionCaughtイベントハンドラに渡す理由です。これは、いくつかのログ機能などに接続する必要があります。 – Algoman