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

时间:2012-11-12 20:11:46

标签: c# .net sockets asynchronous .net-4.0

与同步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',因为它本质上是递归地循环异步调用 也许有多次调用异步方法的开销,比如创建多个线程?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

当您处理基于回调的异步IO时,这是正常的。这就是使用它太可怕的原因!

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