开发者

C# async server socket definition?

can someone explain async socket in c#? I've just followed the sample from MSDN, here's part of my code:

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.

    // ....
}

I put "Thread.Sleep(100000)" after serverSocket.EndAccept and I found out that 开发者_StackOverflow社区the remaining requests is not accepted. This is the sample output:

  1. If the Thread.Sleep(100000) is disabled/commented, the console shows:
    • Server Thread #10
    • Client Thread #11
    • Server Thread #10
    • Client Thread #11
    • Server Thread #10
    • Client Thread #11
    • and so on ...
  2. If the Thread.Sleep(100000) is enabled, the console shows:
    • Server Thread #10
    • Client Thread #11
    • ... No other client request accepted before the first request is completed.

Any explanation to this situation? Thanks


As soon as you call the

Socket clientSocket = serverSocket.EndAccept(ar);

You need to call your BeginAccept method again on the server socket.

So the function would look like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜