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

TCP/IP编程,多个数据包中的数据,tcp,Tcp,我正在用C编写一个应用程序,使用libpcap。我的程序侦听新数据包并解析它们 根据语法。有效负载实际上是XML 有时一个数据包对于一个XML文件是不够的,所以XML缓冲区被分割成单独的数据包。 我想添加代码逻辑以处理这些情况。然而,我事先并不知道一个数据包并不包含全部数据。我如何知道一个数据包有更多的数据将在下一次发送?如何识别新数据包包含其余数据 我必须使用THU FIN标志吗?您能给我解释一下吗?如果您使用的是TCP,请使用将数据作为流提供给您的TCP库,而不是自己尝试处理数据包。流很好。

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

有时一个数据包对于一个XML文件是不够的,所以XML缓冲区被分割成单独的数据包。 我想添加代码逻辑以处理这些情况。然而,我事先并不知道一个数据包并不包含全部数据。我如何知道一个数据包有更多的数据将在下一次发送?如何识别新数据包包含其余数据


我必须使用THU FIN标志吗?您能给我解释一下吗?

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

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

正如前面所说的,使用更高级别的流库

但即使这样,在开始处理之前,您也需要知道块端,因为您将以n个字节的块从流中读取数据


因此,您需要首先以二进制形式发送要发送的字节数,然后发送x字节,然后重复,这样,当您通过
选择
/
读取
接收卡盘时,就可以知道是否有所有的数据块一要传递给处理器。

TCP中没有定义数据包的内容,如果需要的话,这取决于更高层的定义——TCP只是一个流

如果这是TCP流上的原始XML,那么您实际上需要解析XML——当您收到document元素的结尾时,您就会知道什么时候有一个完整的XML文档。 如果它是通过HTTP打包的XML,您可能能够解析出应该包含正文长度的Content-Length:header


请注意,从捕获的数据包重新组装TCP流是一个非常困难的问题,有很多特殊情况,例如,您需要处理重传、无序TCP段等。可能会对您有所帮助。

Jabber使用的XMPP即时消息协议可以通过TCP流移动XML块。我自己也不知道具体是怎么做的,但这是协议定义。你应该可以从中找到答案。

只有当你是终端时,这才有效,如果你正在嗅探现有的连接,则不起作用。同意,我错过了嗅探/嗅探元素,只是假设他正在艰难地进行套接字操作。。