2011-07-10 19 views
1

誰かがC#で非同期ソケットを説明できますか?私はちょうどここに私のコードの一部だ、MSDNからサンプルを追ってきました:C#非同期サーバーソケット定義?

public void Start() 
{ 
    serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); 
    serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 10000); 
    serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 10000); 
    serverSocket.Listen(1000); 
    while (!stop) 
    { 
     Console.WriteLine("Server Thread #" + Thread.CurrentThread.ManagedThreadId); 
     allDone.Reset(); 
     serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket); 
     allDone.WaitOne(); 
    } 
} 
private void AcceptCallback(IAsyncResult ar) 
{ 
    allDone.Set(); 

    Socket serverSocket = (Socket)ar.AsyncState; 
    Socket clientSocket = serverSocket.EndAccept(ar); 

    Console.WriteLine("Client Thread #" + Thread.CurrentThread.ManagedThreadId); 
    Thread.Sleep(100000); <----- All request is stopped, no response returned. 

    // .... 
} 

serverSocket.EndAcceptと私は残りの要求が受け入れられないことが判明した後、私は「のThread.sleep(100000)」を置きます。これは、サンプル出力です:

  1. のThread.sleep(100000)/コンソールが示し、無効にコメントされている場合:
    • Serverのスレッド#10
    • クライアントスレッド#11
    • Serverのスレッド# 10
    • クライアントスレッド#11
    • Serverのスレッド#10
    • クライアントスレッド#11
    • のように...
  2. のThread.sleep(100000)が有効になっている場合は、コンソールには示しています
    • Serverのスレッド#10
    • クライアントスレッド#11
    • ...ありません最初の要求が完了する前に受け入れられた他のクライアント要求。

この状況についての説明はありますか?おかげ

答えて

1

はできるだけ早くあなたが

Socket clientSocket = serverSocket.EndAccept(ar); 

を呼び出すように、サーバーソケットにもう一度BeginAcceptメソッドを呼び出す必要があります。

ので、関数は次のようになります。

private void AcceptCallback(IAsyncResult ar) 
{ 
    allDone.Set(); 

    Socket serverSocket = (Socket)ar.AsyncState; 
    Socket clientSocket = serverSocket.EndAccept(ar); 
    serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket); 

    Console.WriteLine("Client Thread #" + Thread.CurrentThread.ManagedThreadId); 
    Thread.Sleep(100000); 

    // .... 
} 
+0

この場合にも、あなたが 'あなた'スタート() 'メソッド、それを確実にするために待っているだけのいくつかの種類では、'しばらく(ストップを!)必要はありません。メインスレッドは終了しません。それ以外の場合は、新しい接続を受け入れるための2つのポイントがありますが、これは明らかではありません。 –

関連する問題