2009-10-21 33 views
0

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

任何好的指针/链接/例子,这样做的有效方式将不胜感激,因为我无法在网上找到好的例子,我相信这个问题已被其他人以有效的方式在过去解决。聚合缓冲区的

  • 高效的内存分配
  • 快速查找信息的消息边界从缓冲区中提取它

感谢

大卫

回答

3

我发现,简单的方法工作得很好。

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

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

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

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

不是认为愚蠢的技巧,例如一次读出一个字节的套接字将提高性能。每一次系统调用往返都使得8 kB看起来便宜。

+0

谢谢。看起来像是一个很好的解决方案。 – David 2009-10-21 10:57:38