与同步Accept
不同,BeginAccept
不为新创建的连接提供套接字。 EndAccept
确实如此,但它也会阻止 future 的连接被接受;所以我编写了以下代码以允许多个“客户端”连接到我的服务器:
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 提到的,我相信您可以重新编写代码以将 await 用于任务。
关于c# - 对多个连接使用 Socket.BeginAccept/EndAccept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350812/