【问题标题】:Socket Data Handling -for data packing (TCP)套接字数据处理 - 用于数据打包 (TCP)
【发布时间】:2013-06-15 14:16:23
【问题描述】:

我正在做一个套接字项目。我想用 TCP 发送 ~4kb 数据。我需要在这里问一个问题。那就是:如果我用 TCP 发送 ~4kb 数据,我的数据处理函数可以再接收一次这个数据吗?即 RECEIVE(server-side) 函数可以返回 2 次(如果我发送一次 ~4kb 数据)?如果我能理解这一点,我将开始制作自己的数据包处理系统。

【问题讨论】:

  • 这是一个常见的话题:我在tiny.cc/io介绍了其中的一些内容
  • @MarcGravell 谢谢!我会读这篇文章:)
  • 也可能出现相反的情况;多次发送可能导致一次接收。 TCP 只是一个没有离散“消息”概念的流。正如其他人指出的那样,您需要开发一个协议,让您能够辨别何时收到一条完整的消息或多条消息。
  • @Idle_Mind "...你需要开发一个协议..."?即我应该通过 TCP 开发一个*协议?这是一个函数还是一个真正的套接字协议,如 UDP-HTTP-TCP?
  • 您开发了一个基于 TCP 的协议。我的意思是一种让您发送字节流并且仍然能够确定离散消息在哪里开始和结束的方法。这可以通过固定和/或可变长度消息、分隔符、标头等的组合来完成。

标签: c# sockets tcp


【解决方案1】:

简而言之:是的。

TCP 传输字节流,在 TCP 连接中没有提及消息(及其边界)。即使您发送两个字节,它们也可以在两个单独的块中接收(当然理论上;实际上不太可能)。因此,您应该在数据流中添加一些标记。我建议在每条消息之前写一个“消息头”,其中标头至少包含以下消息正文的长度。并且要注意,header本身在接收的时候也有可能是碎片化的。

【讨论】:

    【解决方案2】:

    TCP 是一种流协议。您会按照发送顺序接收字节流。要重建消息,您应该在每条消息前面加上消息的长度,或者使用分隔符来标记消息的结尾。

    我不知道您的业务需求,但您可以使用像 MQTT 这样的二进制协议或像 STOMP 这样的基于文本的协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 2013-07-04
      • 2016-05-02
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多