c# - 如何在接收前不知道数据包大小的情况下通过 TCP 套接字接收数据包?

标签 c# sockets tcp video-streaming aforge

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

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

最佳答案

首先你要明白TCP本身根本就没有“包”的概念,在用户代码层面是没有的。如果有人根据数据包来概念化一个人的 TCP 网络 I/O,他们可能会弄错。

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

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

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

关于c# - 如何在接收前不知道数据包大小的情况下通过 TCP 套接字接收数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27071501/

相关文章:

c# - NHibernate:读取 mysql Blob 字段 - 值返回为 "System.Byte[]"

c# - 如何调用WebMethod?

c# - progressBar 而 MainFrom 初始化

java - spring 任意消息 TCP 套接字

networking - Wireshark - SACK_PERM=1

c# - 如何在c#代码中访问c++ dll类

android - 根据我对 Ejabberd 的请求获取 SSL 相关错误

c - 使用从 recv() tcpServer c 接收的缓冲区的段错误

sockets - Windows Phone P2P TCP/IP 连接

python - 如何故意导致Errno 23 ENFILE