我正在用C ++编写客户端 - 服务器应用程序(TCP协议) 我有可能客户端可以从多个服务器接收数据 为了解决这个问题,我创建了一个套接字连接列表。
在循环中,在每个套接字上执行以下操作:
现在在我的设计中,我最初为所有连接创建了一个公共缓冲区。但我建议,如果网络负载过重,可能会发生接收电报不完整的电报,它可能是电报的一部分。为了使电报完整,我将不得不等待相同插座的下一次迭代,甚至杵/识别电报将是一个复杂的过程。
要处理这种情况,一种解决方案可能是为每个连接提供专用缓冲区。
有人可以建议更优化/更好的解决方案,以避免为每个连接创建专用缓冲区吗?
答案 0 :(得分:3)
如果您对此非常认真,那么每个套接字都使用一个线程,每个线程都有自己的缓冲区,可能也在进行处理或将其传递给特定于连接的处理线程,但您也可以发送所有传入的数据都是单一的工作"排队如果由于某种原因需要连续完成。
如果必须使用单个线程,则必须为每个连接使用缓冲区。 TCP实现了一种流控制,这意味着在接收方已经消耗足够的资源之前,甚至不允许发送方发送更多消息。如果您关注内存使用情况,可以删除已完全处理的特定于连接的缓冲区,并仅在检测到不完整邮件时重新创建它们,但通常最近访问的页面将被换出在紧张的内存情况下,保留内存几乎没有什么害处 - 只要您的(虚拟)地址空间充足:与重复动态内存分配和解除分配相关的时间和碎片可能比峰值内存使用情况更糟。 / p>
答案 1 :(得分:0)
我认为,如果您只想在将所有消息/电报全部存入内存时处理整个消息/电报,那么每个TCP连接的专用接收缓冲区将是唯一的方法。除非您的RAM数量非常有限,或者传入的消息非常大,否则这应该不是问题。 (如果这是一个问题,请考虑将消息缩小的方法;例如,将每条消息分解为一系列可以串行处理的较小消息)