我编写了一个简单的UDP服务,用于侦听从vlc播放器发送的传入UDP数据包。 问题是每次提取的数据大小约为2KB; 93 MB文件的最终输出大小约为14 KB。 =)
我应该调用setsocketOpt来增加recv缓冲区大小吗?
我想知道我的套接字切割数据有什么问题吗? (数据丢失) 要么 提取的数据需要解压缩并进一步处理吗?
我正在使用C ++ winSock库。 一些输出数据如下:
G@GGG@DGG@DGGGGGG@DGGGGG@DGGGGGG@DGGGGGG@DGGGGGGGGGG@GG@DGGGGGG@DG@EG@E
G@EGGGGGGGGGGG@DG@G@DGGGG@EG@EG@EG@B9GGGGG@DGGGGG@DGGGGG@GGGGGGG@DG@D
GG@DGGGGGGGGGG@DGGG@E2|ØzþG@EGGGGGGGG@DG@DGGGGGGGGGGGGGG@DGGGGG@D
G@B2GGG@DG@DG@EG@GGGGGGGGGGGGGGGG@GGGGGGGG@EGGGG@DGGGGGGGG@DGGGG@E
GGGGGGGGGGG@DGGGGGGGGG@DGGGGGGGGGGGG@EGGGGGGGGGGGGGGGG
答案 0 :(得分:0)
UPD不是流媒体协议。 UDP读取返回一个数据包。数据包可能会丢失,重新排序甚至重复。你的代码必须处理这个事实。
缓冲区大小与问题无关。
答案 1 :(得分:0)
UDP是基于消息的协议,数据包具有明确的边界。无法接收部分数据包。也就是说,您将获得完整的消息,或者您将无法获得它。
UDP适用于能够容忍数据包丢失或无序数据包传输的应用程序,但不能在延迟或抖动方面妥协。
TCP适用于可以接受延迟但不能在数据包丢失或数据包排序方面妥协的应用程序。因此,如果您希望通过网络传输碎片数据包来重新组装93MB的整个文件,以便不丢弃数据包,那么TCP / SCTP是更好的选择。