私はソケットを試していて、かなり単純な TCP サーバーを構築しました。
ここで利用可能なコード: http://pastebin.com/zLRaBc0q
クライアントからのソケット サーバーの停止に問題があります。136
ペーストビンの to の行から始まるの192
は、サーバー終了のハンドラです。
背後にあるロジックは非常に単純です。
- 要求しているクライアントを切断します。
- 接続されたクライアントのリストからクライアントを削除します。
- 残りのクライアントを切断して削除します。
- サーバーを閉じます。
- リストからサーバーを削除します。
プログラムは上記を完全に実行しますが、何とか最後に 1 つの余分なステップを押し込むことができReceiveCallback
ます。ObjectDisposedException
100
private static void ReceiveCallback(object sender, SocketAsyncEventArgs e)
{
Socket client = (Socket)sender;
Socket listener = (Socket)e.UserToken;
string message = Encoding.ASCII.GetString(e.Buffer, e.Offset, e.BytesTransferred);
// L100
// \/
IPEndPoint clientCoordinates = client.RemoteEndPoint as IPEndPoint;
IPEndPoint serverCoordinates = listener.LocalEndPoint as IPEndPoint;
Console.WriteLine("{0} bytes from {1} on {2}", e.BytesTransferred, clientCoordinates, serverCoordinates);
明らかに、シャットダウンプロセスでアクセスできませんでしたclient
。ReceiveCallback
ここでの問題は、プログラムが再び入る理由がわからないことです。終了メッセージを処理した後、別の呼び出しを開始せずに void を返します。
言及する価値があるのは、2 つのクライアントが接続されている場合にのみ発生することです。1つのクライアントで問題なく停止します。
しかし、それは(私にとって)それが でrequesting client
終わるのでObjectDisposedException
はなく、他のものであることを示しています。とにかく、なぜReceiveCallback
再び呼び出されるのか理解できないため、それはまだ役に立ちません-クライアントが切断されたため、サーバーを停止する前にそのようにマークする必要があります。
なしでサーバーを停止するにはどうすればよいObjectDisposedException
ですか?
PS私にとっての括弧は単なる補足です。私は非同期+スレッドの初心者なので、一部の動作がどのように発生するかわかりません。