我有一个使用TCP进行通信的2个服务(发起连接的是一个C++ C#服务,接收方是一个C# TCP流)和(假设它们可能不会一直使用相同的TCP连接)。有些时候,我在网络负载很大的情况下得到了一半的消息(其中字节数计算错误)。
为了解决这个问题,我有几个问题:
发布于 2015-06-25 17:23:00
TCP是一种传输字节流的流协议。它不知道(或关心)您的消息边界。
为了发送数据,TCP将流分解成任意大小的数据包。这并不是任意的,而是非常复杂的。并将这些可靠地发送到另一端。
当您从TCP套接字中读取数据时,您将得到已经到达的任何数据,并且2)将适合您提供的缓冲区。
在接收端,您需要使用代码从TCP流重新组装完整的消息。您可能需要自己编写,或者您可能会发现它已经由您使用的任何库(如果有的话)与套接字交互。
发布于 2015-06-25 17:23:46
TCP是一种流协议,它没有“消息”或“数据包”或其他边界。有时,当您接收数据时,您可能无法获得所发送的所有信息,而其他时候,您可能会在接收到的流中获得多个“消息”。
您必须对您的协议进行建模以处理这些事情,例如,通过包括特殊的消息终止器或包含一个固定大小的报头(包括数据大小)。
如果您没有一次收到所有的消息,那么您必须再次接收,甚至是多次,才能获得所有发送的数据。
要回答您的问题,您可以确保按发送的顺序接收流,或者TCP层会给您一个错误。如果字节A是在字节B之前发送的,则保证它们将以该顺序到达。如果发送者和接收者在同一个系统中,或者在不同的大陆上,理论上也没有差别。
https://stackoverflow.com/questions/31056725
复制相似问题