【问题标题】:Is it possible a client receives half of the message following another whole message?客户端是否有可能在另一条完整消息之后收到一半消息?
【发布时间】:2013-10-27 05:00:24
【问题描述】:

如果我有一个看起来像“|SIZE|TYPE|DATA”的 TCP 消息协议,我的读取缓冲区(实际上是我的数据流)是否会像这样(由于错误):

|SIZE|TYPE|DATA|SIZE|TYPE|部分数据|SIZE|TYPE|DATA

这会导致我从 3. 消息中读取字节到 2. 这会发生吗?如何检测这种情况?

编辑:对于“部分数据”,我的意思是该消息的其余部分将丢失并且永远不会收到。另一条完整的消息在该消息之后发送,并找到到达接收者的方式。但是,由于我的 2. 消息未满,我会将 3. 消息的一部分读入我的 2. 消息中。 :(

【问题讨论】:

    标签: tcp buffer protocols


    【解决方案1】:
    1. 您可以在调试代码时将一些控制数据添加到您的消息结构中(例如,根据您的数据计算的 CRC16/32 或 MD5)并在收到的消息中检查它以检测错误。

    2. 您可以使用 Wireshark 或 tcpdump 存储您的流量转储。在转储中,您将看到数据流。如果流中的数据没有错误但收到“部分”消息,则错误在接收代码中,否则在发送代码中。

    【讨论】:

      【解决方案2】:

      是的,您可能没有阅读整条消息。 TCP 中没有消息,它只是一个字节流。 recv() 方法告诉你它收到了多少字节。

      重新编辑,TCP 中没有丢失任何内容。

      【讨论】:

      • 我编辑了我的帖子。我试图描述的问题与我读取的字节数无关。
      • 我最近变得偏执,开始怀疑很多事情。 XD 谢谢!
      猜你喜欢
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多