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:
- 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 ...
- 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);
// ....
}
精彩评论