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: