从TCP套接字接收数据包数据包?

Ali*_*med 9 c c++ sockets tcp

我有一个tcp套接字,我接收视频流.我希望从socket接收数据包,以便我可以删除数据包标头并保留唯一的流数据.我怎样才能做到这一点??

任何帮助将不胜感激.

cni*_*tar 15

你不能.TCP不适用于数据包/消息等.TCP使用字节.你得到一个字节流.问题是,无法保证每次从套接字读取时都会得到的字节数.处理这个的常用方法:

  • 当你想发送一个"数据包"包括作为第一件事的长度
  • 当您从套接字读取内容时,请确保至少读取该长度

你的信息可能是:

|Message Length:4bytes|Additional header Information:whatever1|Message Data:whatever2|
Run Code Online (Sandbox Code Playgroud)

那么你要做的就是读取4个字节,然后读取尽可能多的4个字节告诉你.然后,您将能够剥离标题并获取数据.


dor*_*ron 5

正如其他人所提到的,TCP 是一种流协议。这意味着从 API 的角度来看,没有“数据包”的概念。作为用户,您所能期待的只是数据流。

在内部,TCP 会将流分成可以放入 IP 数据包的段。这些数据包将与控制数据一起通过 IP 发送到远程端。远端将接收这些 IP 数据包。它可能会丢弃某些 IP 数据包(在重复的情况下)、重新排序数据包或保留数据,直到更早的数据包到达。所有这些都是 TCP 内部的,这意味着“TCP 数据包”的概念毫无意义。

您也许可以使用原始套接字来接收原始 IP 数据包,但这意味着您必须重新实现大部分 TCP 堆栈(例如发送 ACK 和调整窗口大小)才能使远程端正确执行。你不想这样做。

另一方面,UDP 是一种数据报协议。这意味着用户知道数据是如何通过网络发送的。如果数据包或数据报的概念对您很重要,您将需要在 UDP 之上构建自己的协议。