c#异步服务器套接字定义
本文关键字:定义 套接字 服务器 异步 | 更新日期: 2023-09-27 18:01:53
有人能解释一下c#中的异步套接字吗?我刚刚遵循了MSDN的示例,下面是我的部分代码:
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.
// ....
}
我把"线程。睡眠(100000)"后serverSocket。EndAccept和我发现剩下的请求不被接受。下面是示例输出:
- 如果Thread.Sleep(100000)被禁用/注释,控制台显示:
- 服务器线程#10
- 客户端线程#11
- 服务器线程#10
- 客户端线程#11
- 服务器线程#10
- 客户端线程#11
- 如果Thread.Sleep(100000)被启用,控制台显示:
- 服务器线程#10
- 客户端线程#11
- …在第一个请求完成之前,没有其他客户端请求被接受。
对这种情况有什么解释吗?由于
一旦你调用
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);
// ....
}