【问题标题】:How do you receive packets through TCP sockets without knowing their packet size before receiving?如何在接收前不知道数据包大小的情况下通过 TCP 套接字接收数据包?
【发布时间】:2014-11-22 11:10:25
【问题描述】:

我正在开发一种网络应用程序,它可以将实时视频源从一个应用程序异步发送到另一个应用程序,有点像 Skype。我遇到的主要问题是我希望能够发送帧,但不必每次在接收之前都知道它们的大小。

AForge.NET 在处理图像时的工作方式是当前帧的大小很可能与前一帧不同。大小不是静态的,所以我只是想知道是否有办法实现这一点。而且,我已经尝试过先发送长度,然后发送帧,但这不是我想要的。

【问题讨论】:

  • TCP 是一种 协议。所以没有像 packet size 这样的东西。 (当你阅读时,你不能保证它是作为单个数据包发送的)所以要么在数据包长度前加上前缀,要么在数据包之间使用分隔符/字符串。
  • AForge 将帧转换为 RGB24 位图,因此您几乎可以保证任何图像的长度都与前一个相同,除非您更改相机配置。但是将图像长度作为前缀发送到有效负载仍然是要走的路。

标签: c# sockets tcp video-streaming aforge


【解决方案1】:

首先,请确保您了解 TCP 本身根本没有“数据包”的概念,而不是在用户代码级别。如果一个人将自己的 TCP 网络 I/O 概念化为数据包,那么他们可能弄错了。

话虽如此,您可以对 TCP 字节流施加数据包结构。要做到这一点,数据包的大小并不总是相同,您只能在数据之前传输长度,或以某种方式分隔数据,例如将其包装在自描述编码中,或以某种方式终止数据。

请注意,当您处理二进制数据时,在数据周围添加结构(编码、终止等)充满了麻烦,因为通常需要二进制数据来支持任何字节组合。这就需要转义数据或以其他方式标记通常看起来像分隔符或终止符的内容,以便可以将其视为二进制数据而不是数据的某些边界。

就个人而言,我只是在数据之前写一个长度。这是一种简单且常用的技术。如果您仍然不想那样做,您应该具体说明为什么您不这样做,以便更好地理解您的具体场景。

【讨论】:

  • 你很迂腐。阅读 RFC 793,它说“术语数据包在这里一般用于表示主机与其网络之间的一个事务的数据。”
猜你喜欢
  • 2011-09-09
  • 2012-09-27
  • 1970-01-01
  • 2018-01-25
  • 2022-01-01
  • 2018-07-19
  • 2013-07-04
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多