c# - 需要有关 TCP 服务器类型的建议以满足此类应用程序

标签 c# c++ tcp

TCP服务器的要求:

  1. 从每个客户端接收并发送 结果返回给同一个客户( 服务器只做这个)
  2. 需要满足 100 个客户
  3. 速度是一个重要因素,即: 即使有 100 个客户端连接,它也不应该延迟。

目前我一直在使用 C# 异步方法,但我发现我总是在大约 20 个连接时遇到延迟。我所说的延迟是指大约需要 15-20 秒才能得到结果。在大约 5-10 个连接时,几乎可以立即得到结果。
实际上,当 tcp 服务器收到消息时,它会与 dll 进行交互,dll 会进行一些处理以返回结果。不确定其背后的工作流程是什么,但在小范围内您看不到任何问题,所以我认为问题可能出在我的 TCP 服务器上。

现在,我正在考虑使用同步方法。这样做,我将有一个 while 循环来阻止 accept 方法,并在接受后为每个客户端生成一个新线程。但是在 100 个连接时,这绝对是矫枉过正。

IOCP 的机会,不太确定,但它似乎像一个连接池,因为它处理 tcp 的方式与正常方式非常相似。

对于这些 TCP 方法,我也不确定每次需要传递消息时打开和关闭连接是否是更好的选择。平均而言,消息从每个客户端以大约 5-10 分钟的间隔传递。

另一种选择可能是使用网络(查看通用处理程序)与服务器仅形成一个连接。任何需要处理的消息都将传递给这个通用处理程序,然后它从服务器发送和接收消息。

特别需要那些大规模做TCP的人的建议。我没有 100 台 PC 供我测试,所以对我来说很难。语言明智的 C# 或 C++ 都可以,我更熟悉 C#,但会考虑移植到 C++ 以提高速度。

最佳答案

你肯定做错了。我个人编写了基于 C# 的服务器,可以处理 1000 多个连接,每秒发送超过 1 条消息,响应时间 <10 毫秒,在商用硬件上。

如果您的响应时间如此之长,那一定是您的服务器进程导致了阻塞。也许是锁争用,也许是简单的错误代码,也许是阻塞外部访问导致线程池耗尽。不幸的是,有很多方法可以把它搞砸,但只有几种方法可以把它弄好。那里有很好的指导方针,从 Rick Vicik 的 High Performance Windows Programming 中涵盖的基础知识开始。文章,回顾 SocketAsyncEventArgs示例涵盖了自 Socket Performance Enhancements in Version 3.5 出现以来在 .Net 中编写套接字应用程序的最高性能方式等等。

如果您发现自己在前面的任务中迷失了方向(就像您碰巧遇到的那样),我会敦促您接受一个既定的沟通框架,也许 WCF使用网络绑定(bind),并使用 declarative service model programming of WCF .这样您就可以利用 WCF 的性能。虽然这对某些人来说可能还不够,但就性能而言,它会让你走得更远,肯定比你现在走得更远。

关于c# - 需要有关 TCP 服务器类型的建议以满足此类应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3488438/

相关文章:

c++ - vector push_back 访问冲突

scala - 使用 Akka IO 通过 Tcp 客户端发送非 ByteString

c - 如何使用轮询接受多个客户端? (TCP 服务器) (C)

c# - 带有文本框的两个日期之间的 SQL 查询

C# 如何在类中使用 get、set 和使用枚举

c# - 虚拟键盘定制

c++ - 嗅探 QWebsocket 服务器 - 客户端通信

c# - 是否可以在 Roslyn 中修改 SyntaxTree 并运行编辑后的代码?

java - 实现基于 FIX 协议(protocol)的订单,支持止损和获利

node.js - TCP和HASH验证