【问题标题】:TCP messages arrival on the same socketTCP 消息到达同一个套接字
【发布时间】:2015-06-25 17:17:39
【问题描述】:

我有 2 个使用 TCP 套接字进行通信的服务(启动连接的服务是 C++ Windows 服务,接收者是 C# TCP 流)和(假设它们可能不使用相同的 TCP 连接每时每刻)。有时我会在网络负载很大的情况下收到一半的消息(字节数以某种方式计算错误)。

为了解决这个问题,我有几个问题:

  • 我能否确定消息(不是数据包...)必须一个接一个,例如,如果我发送消息 1(收到一半),然后发送消息 2,我可以确定消息 1 的下半部分不会在消息 2 之后? 请对所有消息之间的相同 TCP 连接以及它们之间没有相同的 TCP 连接有单独的答案。

  • 发送方和接收方在同一个站有区别吗?

【问题讨论】:

    标签: c# c++ tcpsocket


    【解决方案1】:

    TCP 是一种传输字节流的流协议。它不知道(或关心)您的消息边界。

    为了发送数据,TCP 将流分成任意大小的数据包。 [这不是真的随意,而且真的很复杂。] 并将这些可靠地发送到另一端。

    当您从 TCP 套接字读取数据时,您将获得 1) 已到达的任何数据,并且 2) 将适合您提供的缓冲区。

    在接收端,您需要使用代码重新组合来自 TCP 流的完整消息。您可能必须自己编写它,或者您可能会发现它已经由您用来与套接字交互的任何库(如果有)为您编写。

    【讨论】:

      【解决方案2】:

      TCP 是一种 协议,它没有“消息”或“数据包”或其他边界。有时,当您收到数据时,您可能无法收到所有发送的数据,有时您可能会在接收到的流中收到多个“消息”。

      您必须对协议进行建模以处理这些事情,例如通过包含特殊的消息终止符或包含包含数据大小的固定大小的标头。

      如果您没有一次收到所有消息,那么您必须再次接收,甚至可能多次接收,才能获得发送的所有数据。

      为了回答您的问题,您可以确保按发送顺序接收流,否则 TCP 层会给您一个错误。如果字节 A 在字节 B 之前发送,则可以保证它们将按该顺序到达。如果发送者和接收者在同一个系统上,或者在不同的大陆上,理论上也没有区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        相关资源
        最近更新 更多