【问题标题】:does tcp/ip conveys complete messages?tcp/ip 是否传达完整的消息?
【发布时间】:2011-06-24 21:25:44
【问题描述】:

我正在构建一个库,用于维护 c++ 应用程序之间的网络连接。在一些调试过程中,我发现我从套接字获得的一些信息似乎不完整。完整的信息至关重要,因为如果我使用协议缓冲区的库对其进行解码,我需要完整的消息。

这种现象不是一成不变的。有时我从套接字中获取所有数据,有时不是。测试过程如下:启动服务器,多次启动客户端。我得到的是函数receive() 的输出,它描述了一些变量的值如何变化。其中之一是我用来存储数据的缓冲区的大小。该大小告诉我缓冲区中有多少数据。在这个特定的测试中,客户端发送两条大小为 3(字节)的消息。我希望缓冲区大小是 3 的倍数。但是,有时大小是 4!。这意味着程序读取了一条完整的消息和第二条消息的 1/3。我不明白为什么我总是收到第一条消息。否则,protobuf 将终止程序。

我认为 tcp/ip 应该注意我收到完整的消息。我的问题是我事先不知道尺寸。我希望收到完整的消息,以便我可以正确地解释它。

【问题讨论】:

    标签: tcp network-programming


    【解决方案1】:

    TCP 是基于流的协议,而不是基于消息的协议。 TCP 不知道您的消息何时开始或结束,因此无法保证您将在一次调用中收到完整的消息。也无法保证您将收到一条完整的消息。您必须缓冲收到的数据,并自己将其拆分为消息。如果您没有收到完整的消息,请存储您收到的数据,然后等待其余的数据到达。

    【讨论】:

      【解决方案2】:

      TCP 被允许将您的数据分段成多个数据报,这些数据报在接收方按顺序组装。您可以保证您的数据最终会按照发送的顺序到达。但是您发送的部分数据可能会比其他部分更早到达。

      您的体验可能是,当您拨打receive 时,您发送的部分数据已到达您的计算机,但部分数据仍在通过网络发送。您将不得不缓冲您收到的部分数据并等待,直到您收到完整的“消息”。处理此问题的一种方法是在每条消息的开头发送一个固定长度的记录,该记录对消息中剩余字节的长度进行编码。例如,您可以按网络字节顺序发送一个 4 字节的 unsigned long,然后再发送这么多字节的数据。

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 2015-03-28
        • 2019-11-16
        • 2021-04-28
        • 2012-04-09
        相关资源
        最近更新 更多