0

私はソケットを試していて、かなり単純な TCP サーバーを構築しました。

ここで利用可能なコード: http://pastebin.com/zLRaBc0q

クライアントからのソケット サーバーの停止に問題があります。136ペーストビンの to の行から始まるの192は、サーバー終了のハンドラです。

背後にあるロジックは非常に単純です。

  • 要求しているクライアントを切断します。
  • 接続されたクライアントのリストからクライアントを削除します。
  • 残りのクライアントを切断して削除します。
  • サーバーを閉じます。
  • リストからサーバーを削除します。

プログラムは上記を完全に実行しますが、何とか最後に 1 つの余分なステップを押し込むことができReceiveCallbackます。ObjectDisposedException100

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);

明らかに、シャットダウンプロセスでアクセスできませんでしたclientReceiveCallbackここでの問題は、プログラムが再び入る理由がわからないことです。終了メッセージを処理した後、別の呼び出しを開始せずに void を返します。

言及する価値があるのは、2 つのクライアントが接続されている場合にのみ発生することです。1つのクライアントで問題なく停止します。

しかし、それは(私にとって)それが でrequesting client終わるのでObjectDisposedExceptionはなく、他のものであることを示しています。とにかく、なぜReceiveCallback再び呼び出されるのか理解できないため、それはまだ役に立ちません-クライアントが切断されたため、サーバーを停止する前にそのようにマークする必要があります。

なしでサーバーを停止するにはどうすればよいObjectDisposedExceptionですか?

PS私にとっての括弧は単なる補足です。私は非同期+スレッドの初心者なので、一部の動作がどのように発生するかわかりません。

4

1 に答える 1