TCP / IP编程,多个数据包中的数据

时间:2010-02-10 22:56:43

标签: tcp

我正在使用libpcap在C中编写应用程序。我的程序侦听新数据包并解析它们 根据语法。有效负载实际上是XML。

有时,一个数据包对于XML文件是不够的,因此XML缓冲区被拆分为单独的数据包。 我想添加代码逻辑以处理这些情况。但是我事先并不知道数据包不包含整个数据。我怎么知道数据包有更多的数据将被发送?如何识别新数据包包含其余数据?

我必须使用TH_FIN标志吗?你能解释一下吗?

5 个答案:

答案 0 :(得分:2)

TCP中没有任何内容可以定义数据包,如果需要,可以通过更高层来定义 - TCP只是一个流。

如果这是TCP流上的原始XML,您实际上需要解析xml - 当您收到文档元素的末尾时,您将知道何时有一个完整的xml文档。 如果它是通过HTTP打包的XML,您可能能够解析出Content-Length:标题,该标题应该包含正文的长度。

注意,从捕获的数据包中重新组装TCP流是一个非常难的问题,很多的极端情况,例如:你需要处理重传,乱序tcp段等等。 http://libnids.sourceforge.net/可能会对您有所帮助。

答案 1 :(得分:1)

正如Anon所说,使用更高级别的流库。

但即便如此,你需要在开始处理它之前知道块的一面,因为你将从n个字节的块中读取流。

因此,您希望首先以二进制形式发送要发送的字节数,然后发送x个字节,然后重复,这样当您通过select / read收到chucks时就知道了把所有的块都传递给处理器。

答案 2 :(得分:0)

如果您正在使用TCP,请使用TCP库,该数据库将数据作为流提供,而不是尝试自己处理数据包。

答案 3 :(得分:0)

流很好。另一种选择是将传入的数据存储在缓冲区(例如char *)中并搜索应用程序消息传递框架字符,或者在Xml的情况下搜索根端标记。在缓冲区前面找到完整的xml消息后,将其拉出并处理。

答案 4 :(得分:0)

Jabber使用的XMPP即时消息传递协议具有通过TCP流移动XML块的方法。我不知道自己究竟是如何完成的,但RFC 3290是协议定义。你应该能够解决这个问题。