TCP / IP消息帧示例

时间:2009-10-21 00:33:08

标签: c++ tcp

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

任何有效方法的好指针/链接/示例都会受到赞赏,因为我无法在网上找到好的例子,我确信其他人在过去有效地解决了这个问题。 / p>

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

由于

大卫

1 个答案:

答案 0 :(得分:3)

我发现这个简单的方法效果很好。

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

有更复杂的方法。我最终没有发现它们值得打扰,但你可能视情况而定。

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

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

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