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和我发现剩下的请求不被接受。下面是示例输出:

  1. 如果Thread.Sleep(100000)被禁用/注释,控制台显示:
    • 服务器线程#10
    • 客户端线程#11
    • 服务器线程#10
    • 客户端线程#11
    • 服务器线程#10
    • 客户端线程#11
  2. 如果Thread.Sleep(100000)被启用,控制台显示:
    • 服务器线程#10
    • 客户端线程#11
    • …在第一个请求完成之前,没有其他客户端请求被接受。

对这种情况有什么解释吗?由于

c#异步服务器套接字定义

一旦你调用

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);
    // ....
}