与同步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',因为它本质上是递归地循环异步调用。
也许有多个调用异步方法的开销,例如创建多个线程?
你是什么意思,“它也阻止未来的连接被接受?”套接字继续侦听新连接,但您必须调用某种形式的“接受”来接受每个新连接。使用异步或同步与此无关。 – heavyd
不,这是编写此代码的正常方法。它不是递归的。 –
可以在MSDN上找到使用'ManualResetEvent'的替代方法:http://msdn.microsoft.com/en-us/library/fx6588te.aspx – heavyd