我正在开发一种网络应用程序,它可以将实时视频从一个应用程序异步发送到另一个应用程序,有点像 Skype。我遇到的主要问题是我希望能够发送帧但不必每次在接收之前都知道它们的大小。
AForge.NET 在处理图像时的工作方式是当前帧的大小很可能与之前的帧不同。大小不是静态的,所以我只是想知道是否有办法实现这一目标。而且,我已经尝试先发送长度,然后再发送帧,但这不是我想要的。
最佳答案
首先你要明白TCP本身根本就没有“包”的概念,在用户代码层面是没有的。如果有人根据数据包来概念化一个人的 TCP 网络 I/O,他们可能会弄错。
话虽如此,您可以在 TCP 字节流上强加一个数据包结构。要在数据包大小不总是相同的情况下做到这一点,您只能在数据之前传输长度,或以某种方式分隔数据,例如将其包装在自描述编码中,或以某种方式终止数据。
请注意,在处理二进制数据时,在数据周围添加结构(编码、终止等)会很麻烦,因为二进制数据通常需要支持任何字节组合。这引入了对数据进行转义或以其他方式标记通常看起来像定界符或终止符的内容的需要,以便可以将其视为二进制数据而不是数据的某些边界。
就个人而言,我只是在数据之前写一个长度。这是一种简单且常用的技术。如果您仍然不想那样做,您应该具体并解释为什么您不这样做,以便更好地理解您的特定场景。
关于c# - 如何在接收前不知道数据包大小的情况下通过 TCP 套接字接收数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27071501/