C# 对多个连接使用Socket.beginacept/EndAccept
与同步的C# 对多个连接使用Socket.beginacept/EndAccept,c#,.net,sockets,asynchronous,.net-4.0,C#,.net,Sockets,Asynchronous,.net 4.0,与同步的Accept不同,BeginAccept不为新创建的连接提供套接字EndAccept但是确实如此,但它也会阻止将来的连接被接受;因此,我编造了以下代码,允许多个“客户端”连接到我的服务器: serverSocket.BeginAccept(AcceptCallback, serverSocket); AcceptCallbackcode: void AcceptCallback(IAsyncResult result) { Socket server = (Socket)res
Accept
不同,BeginAccept
不为新创建的连接提供套接字EndAccept
但是确实如此,但它也会阻止将来的连接被接受;因此,我编造了以下代码,允许多个“客户端”连接到我的服务器:
serverSocket.BeginAccept(AcceptCallback, serverSocket);
AcceptCallback
code:
void AcceptCallback(IAsyncResult result)
{
Socket server = (Socket)result.AsyncState;
Socket client = server.EndAccept(result);
// client socket logic...
server.BeginAccept(AcceptCallback, server); // <- continue accepting connections
}
void AcceptCallback(IAsyncResult结果)
{
套接字服务器=(套接字)result.AsyncState;
Socket client=server.EndAccept(结果);
//客户端套接字逻辑。。。
beginacept(AcceptCallback,server);//当您处理基于回调的异步IO时,这是正常的。这就是为什么使用它如此糟糕的原因
你能使用C#await吗?这将简化为一个简单的,而(true){await accept();}
循环。这样做的方式对于使用异步套接字是正确的。就我个人而言,我会在您从异步状态获取套接字后立即将BeginAccept移动到。这将允许您立即接受其他连接。现在,处理代码将在您准备接受另一个连接之前运行
正如Usr所提到的,我相信您可以重新编写代码,以便在任务中使用wait。您所说的“它还阻止将来的连接被接受”是什么意思套接字继续侦听新连接,但您必须调用某种形式的Accept
才能接受每个新连接。使用异步或同步与此无关。不,这是编写此代码的正常方式。它不是递归的。可以找到另一种替代方法,使用ManualResetEvent
n MSDN: