TCP消息到达同一个套接字

时间:2015-06-25 17:17:40

标签: c# c++ tcpsocket

我有一个使用TCP套接字进行通信的2个服务(启动连接的服务是C ++ Windows服务,接收者是C#TCP流)并且(让我们说它们可能会不要一直使用相同的TCP连接)。有些时候我在一个很大的网络负载上得到一半的消息(在某​​种程度上错误地计算了字节数)。

我有几个问题需要解决这个问题:

  • 我可以确定消息(而不是数据包......)必须互相跟随,例如,如果我发送消息1(收到的是一半),然后消息2,我可以确定消息1的下一半不会在消息2之后? 请为所有消息之间的相同TCP连接单独回答,并且它们之间没有相同的TCP连接。

  • 发件人和收件人是否在同一个电台上有什么区别吗?

2 个答案:

答案 0 :(得分:2)

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

为了发送数据,TCP将流分解为任意大小的数据包。 [它并不是真正的武断,而且非常复杂。]并将这些可靠地发送到另一端。

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

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

答案 1 :(得分:2)

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

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

如果您没有立即收到所有消息,那么您必须再次收到,甚至可能多次收到,以获取所有已发送的数据。

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