4

与 synchronous 不同AcceptBeginAccept不为新创建的连接提供套接字。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”,因为它本质上是递归地循环异步调用。
也许对异步方法进行多次调用会产生开销,例如创建多个线程?

4

2 回答 2

4

这样做的方式对于使用异步套接字是正确的。就个人而言,在您从 AsyncState 获取套接字后,我会将您的 BeginAccept 移至右侧。这将允许您立即接受其他连接。就像现在一样,处理代码将在您准备好接受另一个连接之前运行。

正如 Usr 所提到的,我相信您可以重新编写代码以将 await 用于任务。

于 2013-01-09T20:01:59.557 回答
1

当您处理基于回调的异步 IO 时,这是正常的。这就是它使用起来如此糟糕的原因!

你可以使用 C# 等待吗?这会将其简化为一个简单的while (true) { await accept(); }循环。

于 2012-12-16T21:22:22.133 回答