c# - 对多个连接使用 Socket.BeginAccept/EndAccept

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

与同步Accept 不同,BeginAccept 不为新创建的连接提供套接字。 EndAccept 确实如此,但它也会阻止 future 的连接被接受;所以我编写了以下代码以允许多个“客户端”连接到我的服务器:

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”,因为它本质上是递归地循环异步调用。
多次调用异步方法可能会产生开销,例如创建多个线程?

最佳答案

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

正如 Usr 提到的,我相信您可以重新编写代码以将 await 用于任务。

关于c# - 对多个连接使用 Socket.BeginAccept/EndAccept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350812/

相关文章:

c# - 迁移到 AutoMapper 5 - 循环引用

c# - Razor "if"语句中的 HtmlHelper

c# - 我可以在 C# 中创建一个全局异常处理程序,让代码在之后继续运行吗?

.net - Silverlight是否要求安装.NET框架?

objective-c - 通过所有可用网络接口(interface)使用 GCDAsyncUdpSocket 进行 UDP 广播

c# - LINQ:使用 Lambda 表达式获取 CheckBoxList 的所有选定值

c# - 等待新任务 <T>( ... ) : Task does not run?

c# - System.Net.Sockets - 定义超时? (C#)

sockets - 非阻塞套接字轮询与阻塞套接字

sockets - Chrome 挂起 "sending request"似乎与套接字有关