我有一个TCP套接字,用于接收视频流。我想逐个数据包地从套接字接收数据,以便我可以删除数据包头,并保留只有流数据。我该怎么做?
任何帮助将不胜感激。
你不能这样做。TCP
不适用于数据包或消息等,而是适用于字节。你会得到一串字节流。问题在于,每次从套接字读取时,没有关于你将获得多少字节的保证。通常的处理方式是:
你的信息可能是:
|Message Length:4bytes|Additional header Information:whatever1|Message Data:whatever2|
接下来你需要做的是读取4个字节,然后根据这4个字节所指示的大小继续读取。这样你就能够剥离头部并获取数据。
tap
接口(OpenVPN 甚至有一个 Windows tap 接口),实现自己的 TCP 协议栈,并提供具有 STREAM
可见性的数据包 API;但这是非常繁琐的工作。 - Mike PenningtonSCTP
。在操作系统中实现TCP协议栈是比实现其他任何东西都要困难。 - cnicutar你对这种方法很有把握吗?在我看来,这些“预处理”将给系统带来额外的负担。当然,这是由较低层处理的(请阅读OSI模型),因此不容易更改。请注意,大多数现有的流媒体协议已经针对最佳性能进行了优化。