例外ハンドリングを必要とせずに、サーバまたはクライアントから正常に接続を閉じることができるように、パターンやパターンを教えてください。ソケット対TCP接続を例外なく正常に閉じるにはどうすればよいですか?
れるtcpClient:は私がれるtcpClient クライアントクラスを使用することに縛られていませんよ。私は次のような コードを書いて、 の可能な最も単純なケースを実証しようとしています。私は ソケットを使用していた& SocketAsyncEventArgs しかし、この問題に対処するには も複雑になっていました。非同期対ブロッキング
:ので ブロッキング呼び出しのこれは 困難または不可能かもしれません。もしそうなら、それはいいですが、 非同期のケースではどうやって解決しますか?
トークン?:私は「終了」それはシャットダウンに知っているように、他の側にトークンのいくつかの種類を送信して実験してきたが、それは働いてもらっていないを終了し、私はここで、最小限の例を提示したかったです。
とにかく必要な例外処理:私は、ネットワーク接続などが失敗すると例外処理が実際のアプリケーションに必要になります知っています。しかし、は予期しないシャットダウンのケースが例外なく処理されることはできませんか?
編集:私は、元の移動とgistにコードを答えます。
オリジナルは例は不合格:ここに移動:https://gist.github.com/958955#file_original.cs
現在の作業回答:https://gist.github.com/958955#file_answer.cs
class Channel
{
private readonly TcpClient client;
private readonly NetworkStream stream;
private readonly string name;
private readonly ManualResetEvent quit = new ManualResetEvent(false);
public Channel(string name, TcpClient client)
{
this.name = name;
this.client = client;
stream = client.GetStream();
}
public void Run()
{
Console.WriteLine(name + ": connected");
byte[] buffer = new byte[client.Client.ReceiveBufferSize];
stream.BeginRead(buffer, 0, buffer.Length, this.Read, buffer);
var writer = new StreamWriter(stream, Encoding.ASCII);
while (true)
{
var line = Console.ReadLine();
if (String.IsNullOrEmpty(line) || !this.client.Connected) break;
writer.WriteLine(line);
writer.Flush();
}
if (client.Connected)
{
Console.WriteLine(name + " shutting down send.");
client.Client.Shutdown(SocketShutdown.Send);
Console.WriteLine(name + " waiting for read to quit.");
quit.WaitOne();
}
else
{
Console.WriteLine(name + " socket already closed");
}
Console.WriteLine(name + " quit, press key to exit.");
Console.ReadKey();
}
private void Read(IAsyncResult result)
{
var bytesRead = this.stream.EndRead(result);
if (bytesRead == 0)
{
Console.WriteLine(name + " read stopped, closing socket.");
this.client.Close();
this.quit.Set();
return;
}
var buffer = (byte[])result.AsyncState;
Console.WriteLine(name + " recieved:" + Encoding.ASCII.GetString((byte[])result.AsyncState, 0, bytesRead));
stream.BeginRead(buffer, 0, buffer.Length, this.Read, buffer);
}
}
現在の例になります。 usingは例外をトラップしません。それにもかかわらず、私は優雅なシャットダウン中に例外を完全に投げるのを避ける方法を探しています。 –