首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >到达同一套接字上的TCP消息

到达同一套接字上的TCP消息
EN

Stack Overflow用户
提问于 2015-06-25 17:17:39
回答 2查看 534关注 0票数 1

我有一个使用TCP进行通信的2个服务(发起连接的是一个C++ C#服务,接收方是一个C# TCP流)和(假设它们可能不会一直使用相同的TCP连接)。有些时候,我在网络负载很大的情况下得到了一半的消息(其中字节数计算错误)。

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

  • 我能确定消息(不是数据包.)例如,如果我发送消息1(作为一半接收),那么消息2,我能确保消息1的下半部分不会在消息2之后吗?请为所有消息之间的相同TCP连接提供单独的答案,而在它们之间没有相同的TCP连接。
  • 发件人和接受者是否站在同一站有什么不同?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-25 17:23:00

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 17:23:46

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31056725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档