【问题标题】:TCP/IP programming, data in more than one packetTCP/IP编程,多包数据
【发布时间】:2010-02-10 22:56:42
【问题描述】:

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

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

我必须使用 TH_FIN 标志吗?可以给我解释一下吗?

【问题讨论】:

    标签: tcp


    【解决方案1】:

    TCP 中没有定义数据包的内容,这取决于更高层是否需要定义 - TCP 只是一个流。

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

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

    【讨论】:

      【解决方案2】:

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

      但即便如此,您也需要在开始处理之前了解块方面,因为您将从流中读取 n 个字节的块。

      因此,您想首先以二进制形式发送要发送的字节数,然后发送 x 字节,然后重复,因此当您通过 select/read 接收卡盘时,就知道您拥有所有的块一个传递给处理器。

      【讨论】:

      • 只有在您是终止端时才有效,而不是在您嗅探现有连接时才有效
      • 同意,我错过了嗅探/窥探元素,只是假设他正在努力使用套接字..
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          Jabber 使用的 XMPP 即时消息传递协议具有在 TCP 流上移动 XML 块的方法。我自己不知道具体是怎么做的,但RFC 3290 是协议定义。您应该可以从中解决问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-30
            • 2016-04-19
            • 1970-01-01
            • 2015-06-24
            • 2013-09-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多