2012-11-12 19 views
4

与同步Accept不同,BeginAccept不为新创建的连接提供套接字。但是,它也阻止未来的连接被接受;所以我炮制了如下代码,允许多个“客户”连接到我的服务器:对于多个连接使用Socket.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',因为它本质上是递归地循环异步调用。
也许有多个调用异步方法的开销,例如创建多个线程?

+0

你是什么意思,“它也阻止未来的连接被接受?”套接字继续侦听新连接,但您必须调用某种形式的“接受”来接受每个新连接。使用异步或同步与此无关。 – heavyd

+0

不,这是编写此代码的正常方法。它不是递归的。 –

+1

可以在MSDN上找到使用'ManualResetEvent'的替代方法:http://msdn.microsoft.com/en-us/library/fx6588te.aspx – heavyd

回答

1

当处理基于回调的异步IO时,这是正常的。而这正是使它如此可怕的使用!

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

3

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

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