c++ - 优化网络负载大时接收数据包的流程

标签 c++ tcp network-programming tcpclient

<分区>

我正在用 C++ 编写客户端-服务器应用程序(TCP 协议(protocol))。
我有可能客户端可以从多个服务器接收数据。
为了解决这个问题,我创建了一个套接字连接列表。

在循环中,在每个套接字上,我执行以下操作:

  • 尝试在套接字上接收数据
  • 将其放入缓冲区
  • 处理缓冲区数据
  • 清除缓冲区
  • 对下一个套接字执行相同的步骤

现在在我的设计中,最初我为所有连接创建了一个公共(public)缓冲区。但我建议在网络负载过重的情况下,收到的电报可能不是完整的电报,可能是电报的一部分。因此,为了使电报完整,我将不得不等待同一套接字的下一次迭代,甚至连串/识别电报也将是一个复杂的过程。

要处理这种情况,一种解决方案可能是为每个连接提供专用缓冲区。

有人可以建议更优化/更好的解决方案来避免为每个连接创建专用缓冲区吗?

最佳答案

如果你认真对待这个你会为每个套接字使用一个线程,每个套接字都有自己的缓冲区,可能也进行处理或将它传递给特定于连接的处理线程,但你也可以发送所有传入数据如果出于某种原因需要连续完成,则将其分配到单个“工作”队列。

如果你必须使用单线程,那么你必须为每个连接使用一个缓冲区。 TCP 实现了一种流量控制,这意味着在接收方消耗足够多之前,发送方甚至可能不允许发送更多消息。如果您担心内存使用情况,您可以删除已完全处理的特定于连接的缓冲区,并且仅在检测到不完整的消息时才重新创建它们,但通常最近未访问的页面将在内存紧张的情况下被换出因此保留内存几乎没有什么害处 - 只要您的(虚拟)地址空间充足:与重复动态内存分配和释放相关的时间和碎片可能比峰值内存使用更糟糕。

关于c++ - 优化网络负载大时接收数据包的流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483563/

相关文章:

c - 获取地址信息错误 : ai_socktype not supported

sockets - 如何模拟 boost::asio::write 超时

c - 未声明的变量和预期的标识符错误

c++ - 在 C++ 中保持对函数返回值的引用

c++ - 没有页面文件的 Windows XP 内存管理 - 后果是什么。堆碎片?

c++ - 类设计: how to add sequencing or alternating logic to API

c++ - typedef 和 using 会导致模板实例化吗?

tcp - BPF 过滤器 TCP 连接

C# 分隔 TCP 消息

network-programming - TCP/IP 长期连接