使用Socket.BeginAccept / EndAccept进行多个连接

与同步Accept不同, BeginAccept不为新创建的连接提供套接字。 但是EndAccept确实如此,但它也阻止了未来的连接被接受; 所以我编写了以下代码以允许多个“客户端”连接到我的服务器:

 serverSocket.BeginAccept(AcceptCallback, serverSocket); 

AcceptCallback代码:

 void AcceptCallback(IAsyncResult result) { Socket server = (Socket)result.AsyncState; Socket client = server.EndAccept(result); // client socket logic... server.BeginAccept(AcceptCallback, server); // <- continue accepting connections } 

有一个更好的方法吗? 它看起来有点’hacky’,因为它本质上是递归地循环异步调用。
也许有多次调用异步方法的开销,比如创建多个线程?

使用异步套接字的方法是正确的。 就个人而言,在从AsyncState获取套接字后,我会将您的BeginAccept移动到正确的位置。 这样您就可以立即接受其他连接。 就像现在一样,处理代码将在您准备好接受另一个连接之前运行。

正如Usr所提到的,我相信你可以重新编写代码来使用等待任务。

处理基于回调的异步IO时,这是正常的。 而这正是使它如此糟糕的原因!

你能用C#等待吗? 这将简化为简单的while (true) { await accept(); } while (true) { await accept(); }循环。