【发布时间】:2016-08-05 16:31:33
【问题描述】:
我需要使用 C# .NET 4.5+ 构建一个 TCP 服务器,它必须能够轻松处理至少 3,000 个连接的客户端,这些客户端将每 10 秒发送一次消息,消息大小为 250 到 500 字节。
数据将被卸载到另一个进程或队列进行批处理和记录。
我还需要能够选择现有客户端以在 Windows 窗体应用程序中发送和接收消息(大于 500 字节)消息。
我以前没有构建过这样的应用程序,所以我的知识基于我在网上找到的各种问题、示例和文档。
我的结论是:
- 非阻塞异步是要走的路。远离创建多个线程和阻塞 IO。
- SocketAsyncEventArgs - 很复杂,真的只需要非常大的系统,顺便说一句,什么是非常大的系统? :-)
- BeginXXX 方法就足够了 (EAP)。
- 使用 TAP 我可以简化 3. 通过使用 Task.Factory.FromAsync,但它只会产生相同的结果。
- 使用全局集合来跟踪连接的 tcp 客户端
我不确定的:
- 与 TCP 客户端集合交互时是否应该使用 ManualResetEvent?我认为 asyc 事件需要锁定对这个集合的访问。
- 在我调用了 BeginReceive 之后检测断开连接的客户端的最佳方法。我发现呼叫卡在等待响应,因此需要清理。
- 向特定 TCP 客户端发送消息。我正在考虑自定义 TCP 会话类中的函数来发送消息。再次在异步模型中,我是否需要创建一个基于计时器的进程来检查消息队列,或者我是否需要在可以访问 TcpClient 和关联流的 TCP Session 类上创建一个事件?真的很感兴趣这里的意见。
- 我想为整个服务使用一个线程并在其中使用非阻塞主体,有什么我应该特别注意的,尤其是在 1.ManualResetEvent 等的上下文中。
感谢您的阅读。我很想听到建设性的想法和/或最佳实践/示例的链接。自从我用 c# 编写代码以来已经有一段时间了,如果我的一些问题很明显,我深表歉意。任务,异步/等待对我来说是新的! :-)
【问题讨论】:
-
在 Internet 上搜索“IO Completion Ports .NET”
-
@selbie 抱歉,我可能不清楚,我想在 C# 中执行此操作。您是否建议我使用 C++ 或在 .NET 中实现的 IOCP 概念,我只是认为在 .NET 4.5 中会有更简单且性能更好的替代方案。有一个代码项目示例可以做到这一点,但我再次认为事件/任务驱动的方法就足够了。
-
所有异步套接字 API 都已使用 IOCP。
标签: sockets async-await .net-4.5 tcplistener