gpt4 book ai didi

c++ - TCP/IP 消息框架示例

转载 作者:行者123 更新时间:2023-11-28 01:12:40 24 4
gpt4 key购买 nike

我正在尝试寻找具体示例,说明如何管理中断 TCP/IP 套接字上的传入数据流并将此数据聚合到某种缓冲区中,以便我可以在其中找到消息(可变长度 header + 定界符)并提取它们以为接收应用程序重建消息。

任何关于有效执行此操作的好的指示/链接/示例都将不胜感激,因为我无法在网上找到好的示例,而且我确信过去其他人已经以有效的方式解决了这个问题。

  • 聚合缓冲区的高效内存分配
  • 快速找到消息的消息边界以将其从缓冲区中提取

谢谢

大卫

最佳答案

我发现这个简单的方法非常有效。

  • 分配一个固定大小的缓冲区,大小是最大消息大小的两倍。一个缓冲区。在缓冲区中保留指向数据末尾的指针。
  • 分配发生一次。下一部分是消息循环:
  • 如果不使用阻塞套接字,则在此处轮询选择
  • 在结束数据指针处将数据读入缓冲区。只读取适合缓冲区的内容。
  • 使用 strchr 扫描分隔符的新数据。如果您发现一条消息:
    • memcpy 将消息放入它自己的缓冲区中。 (注意:我这样做是因为我使用的是线程,您可能也应该这样做。)
    • memmove 剩余的缓冲区数据到缓冲区的开头并更新数据指针的结尾。
    • 调用消息的处理函数。 (将其发送到线程池。)

还有更复杂的方法。最后我还没有发现它们值得麻烦,但你可能会视情况而定。

您可以使用带有数据指针开始和结束的循环缓冲区。很多麻烦的跟踪和计算剩余空间等。

您可以在找到每条消息后分配一个新缓冲区。您不必到处复制那么多数据。找到分隔符后,您仍然需要将多余的数据移动到新的消息缓冲区中。

不要不要认为从套接字中一次读取一个字节这样的愚蠢技巧会提高性能。每个系统调用往返都使 8 kB 的 memmove 看起来很便宜。

关于c++ - TCP/IP 消息框架示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com