【发布时间】:2014-08-20 10:29:39
【问题描述】:
我正在用 C++ 编写客户端-服务器应用程序(TCP 协议)。
我有可能客户端可以从多个服务器接收数据。
为了解决这个问题,我创建了一个套接字连接列表。
在一个循环中,在每个套接字上,我执行以下操作:
- 尝试在套接字上接收有关此的数据
- 把它放在缓冲区中
- 处理缓冲区数据
- 清除缓冲区
- 对下一个套接字执行相同的步骤
现在在我的设计中,最初我为所有连接创建了一个公共缓冲区。但我建议在网络负载过重的情况下,收到的电报可能不是完整的电报,它可能是电报的一部分。所以要完成一个电报,我将不得不等待下一次迭代相同的套接字,甚至俱乐部/识别电报将是一个复杂的过程。
要处理这种情况,一种解决方案可能是为每个连接提供专用缓冲区。
任何人都可以提出更优化/更好的解决方案来避免为每个连接创建专用缓冲区吗?
【问题讨论】:
-
看看 Boost Asio boost.org/doc/libs/1_55_0/doc/html/boost_asio.html 这样您就不必重新发明轮子了。一般来说,如果您需要能够保存部分数据的实例,则需要为此设置一个缓冲区。另请注意,网络堆栈将为您缓冲 TCP 数据,因此取决于您的确切要求,可能就足够了。
-
“没有收到完整的电报”问题并不是重负载所独有的。你也会在轻负载时遇到这个问题。 TCP 套接字流一直接收部分数据 - 这是 TCP 的本质(通过分段、分段、网络上的打嗝等)。在任何情况下,您总是希望在每个套接字上循环,直到收到完整的消息。
-
@selbie:很好,同样:如果您发送两条消息,它们可能会通过一次调用
recv或read来接收。归根结底,TCP 是一个具有流量控制的 字节流 协议,您必须为阻塞和/或部分发送以及部分/合并接收做好准备。 -
据我从所有 cmets 和答案中了解到,每个连接的缓冲区是解决此问题的唯一方法。
标签: c++ tcp network-programming tcpclient