【问题标题】:TCP/IP and designing networking applicationTCP/IP 和设计网络应用程序
【发布时间】:2026-01-23 07:50:02
【问题描述】:

我正在阅读有关以最有效的方式实现客户端-服务器的方法,我碰到了那个链接: http://msdn.microsoft.com/en-us/library/ms740550(VS.85).aspx

说:

“并发连接不应超过两个,特殊用途的应用程序除外。超过两个并发连接会导致资源浪费。一个好的规则是每个目标最多有四个短期连接,或者两个持久连接”

我不太明白他们所说的 2 是什么意思……以及他们所说的持久性是什么意思?

假设我有一个服务器,它监听许多客户,他们假设与服务器做一些工作,我怎样才能保持只有 2 个连接打开? 无论如何,最好的方法是什么?我阅读了一些关于完成端口的信息,但找不到很好的代码示例,或者至少是一个体面的解释。

谢谢

【问题讨论】:

    标签: c++ networking tcp connection


    【解决方案1】:

    最后一句话你读了吗:

    一个好的规则是最多有四个 短暂的联系,或两个 每个持久连接 目的地。

    从文章中很难说,但我认为目的地是客户。这不是一篇很好的文章。

    【讨论】:

    • 我也是这样阅读这篇文章的(与其说是一篇文章,不如说是一些没有太多解释的简短陈述)。一般来说,服务器不会规定与其客户端的连接的生命周期,除非服务器本身正在关闭。客户决定生命周期。但是,服务器可以规定每个客户端只能获得一个连接。
    【解决方案2】:

    持久连接是客户端连接到服务器然后执行所有操作而不断开连接的地方。即使客户端有一段时间不需要服务器,它也会保持与服务器的连接,为可能再次需要它做好准备。

    短暂的连接是客户端连接、执行其操作然后断开连接的连接。如果它需要服务器的更多帮助,它将重新连接到服务器并执行另一个操作。

    作为实现连接侦听端的服务器,您可以在侦听 TCP/IP 套接字中设置选项,以限制将在套接字级别保持的连接数,并决定您希望接受的连接数- 这将允许您根据需要接受 2 个持久连接或 4 个短期连接。

    【讨论】:

      【解决方案3】:

      他们所说的“持久”是一个打开的连接,然后保持打开状态。确定使用“始终在线”连接占用资源是否更昂贵,还是每次需要时都要承受打开和关闭连接的开销,这是一个很常见的问题。

      不过,也许值得退后一步。

      如果您的服务器必须侦听来自大量客户端的请求,那么您可能有一个基于消息的架构的完美用例。如果您使用像 TCP/IP 那样的紧密耦合连接,您的客户端和服务器将不得不相互了解很多,并且您将不得不编写大量低级连接代码。

      在基于消息的架构下,您的客户端可以将消息放在队列中。然后服务器可以监视该队列。它可以将消息从队列中取出,执行工作,然后将响应放回队列中,客户端可以在那里提取它们。

      通过这样的设计,客户端和服务器不必相互了解任何信息。只要它们可以将格式正确的消息放在队列上,并连接到队列,它们就可以用完全不同的语言实现,并在不同的操作系统上运行。

      Apache ActiveMQ 和 Weblogic 等面向消息传递的中间件提供 API,您可以从 C++ 中使用这些 API 来管理和使用队列以及其他消息传递对象。 ActiveMQ 是开源的,而 Weblogic 是由 Oracle(收购 BEA)出售的。那里还有许多其他出色的消息传递服务器,因此可以使用这些作为示例,让您开始,如果消息传递听起来值得探索的话。

      【讨论】:

      • ...当然,如果您的用例比我想象的要低,那么使用面向消息传递的中间件的开销可能会太高。这完全取决于客户端和服务器正在执行的工作类型。
      • 由于链接来自 MSDN,并且您已使用 C++ 对其进行了标记,因此您可能拥有 MSMQ 所需的一切。我没有使用它,但它似乎在正确的附近。我在 cmets 中遇到了锚标签的问题。这是微软官方页面:microsoft.com/windowsserver2003/technologies/msmq/default.mspx
      【解决方案4】:

      我认为关键词是“每个目的地”。单个 tcp 连接尝试加速到可用带宽。因此,如果您允许更多连接到同一目的地,它们必须共享相同的带宽。

      这意味着每次传输都会比它可能的速度慢,并且服务器必须为更长的时间分配更多资源 - 每个连接的数据结构。

      因为建立 tcp 连接是“耗时的”,所以在服务第一个连接时允许及时建立第二个连接是有意义的,因此它们相互重叠。对于短连接的设置时间可能与为连接本身提供服务的时间相同(请参阅性能不佳的示例),因此需要更多的连接来有效地填充所有带宽。

      (对不起,我还不能发布超链接) 这里 msdn.microsoft.com/en-us/library/ms738559%28VS.85%29.aspx 你可以看到,什么是性能差。

      这里的 msdn.microsoft.com/en-us/magazine/cc300760.aspx 是线程服务器的一些示例,性能相当不错。

      您可以通过限制accept() 调用次数来限制打开的连接数。您可以通过取消连接来限制来自同一来源的连接数量,当您发现您已经有两个以上来自该位置的连接(只需计算它们)。

      例如 SMTP 以类似的方式工作。当连接过多时,它会返回4xx 代码并关闭您的连接。

      另请参阅此问题: What is the best epoll/kqueue/select equvalient on Windows?

      【讨论】:

        最近更新 更多