2011-07-10 51 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. 

    // .... 
} 

我把“Thread.sleep代码(100000)”后serverSocket.EndAccept,我发现了剩余的请求不被接受。这是示例输出:

  1. 如果Thread.sleep代码(100000)被禁用/评论的,控制台显示:
    • 服务器线程#10
    • 客户线程#11
    • 服务器线程# 10
    • 客户线程#11
    • 服务器线程#10
    • 客户线程#11
    • 等等...
  2. 如果Thread.sleep代码(100000)已启用,控制台显示:
    • 服务器线程#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

此外,在这种情况下,你不需要'而(停止!)'在'开始()'方法,只是某种等待保证主线程不终止。否则,你会有两点接受不明显的新连接。 –