.net - begin/end 与 1000 个客户端的 socketasynceventargs

标签 .net sockets networking socketasynceventargs

我想知道哪种异步类型在开发速度和稳定性方面都是最好的。我正在编写一个概念验证网络应用程序,它必须支持 1000 个并发客户端。

每个客户端每秒发送大约 5 个 30 字节的数据包。 服务器每秒发送大约 5 个 200 字节的数据包。

我从之前使用阻塞套接字的测试中获得了这些数字。我认为我应该使用 SocketAsyncEventArgs 因为吞吐量较高,但这也需要更长的时间来开发。

谢谢

最佳答案

IIRC 两者之间的主要区别在于 SocketAsyncEventArgs 消除了分配大量对象(即回调等)的需要,考虑到您的吞吐量,这可能是一个有效的问题。特别是,这可能有助于防止由于 GC 导致的周期性性能下降。另一个好处是混合“这可能运行异步,也可能运行同步;我会告诉你哪一个”——需要一小会儿的时间来适应,但非常方便。

但是,与所有事物一样,任何高吞吐量系统都需要设计以实现高吞吐量。如果您是从头开始,我会很难找到不使用 SocketAsyncEventArgs 的理由 - 无论哪种方式,异步网络 IO 总是需要一些头痛和规划。当我们为 SE 编写 Web 套接字服务器(处理 50k+ 并发连接)时,一个特别有用的技巧是确保我们回收所有 byte[] 缓冲区,即从中获取它们(并返回它们到)中央缓冲区池,仅在池为空时分配新缓冲区(并且作为推论,仅在池已满时才将缓冲区丢弃在地板上)。当然,在这种情况下,我们可能不会每次都与所有客户交谈;如果您要定期与每个客户端交谈,另一个选择可能是为每个连接添加一个缓冲区。也许更多的内存开销,但可能会让事情变得更简单。

至于“还需要更长的时间来开发”;这可能是真的,特别是如果您已经非常熟悉旧的异步模型。我想这取决于拥有一台性能稳定的服务器有多重要。当然,这两种方法都需要严格的测试。

关于.net - begin/end 与 1000 个客户端的 socketasynceventargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824751/

相关文章:

c# - 检测以太网适配器是否为 Auto-MDIX

c# - 在不知道背后的类的情况下获取 C# 中特定对象属性的值

.net - 从 Windows C 函数返回字符串

c - TCP服务器停止连接

c# - 通过 C# 使用 winapi 从 "net use"获取状态列

c++ - 如何在基于 C++/QT 的安装程序中检测互联网断开连接

c# - Entity Framework `AsNoTracking` 不适用于匿名投影

c# - 列表+详细信息 - 最佳方法?

c - ICMP 套接字(赢)

java - 在 Java 中配置套接字以使用小数据包