我需要使用udp发送和接收非常大的数据。不幸的是,udp每个图提供8192个字节,因此需要将数据分成更小的部分。
我正在使用Qt和QUdpSocket
。我想发送给客户端的QByteArray
长度为921600。我想每次发送8192个字节。
分割QByteArray
的快捷方法是什么?
答案 0 :(得分:5)
您永远不需要显式拆分数据,一次只需8 KB。通常,将数据写入套接字的函数(包括QUdpSocket::writeDatagram
,似乎)接受指向第一个字节和字节计数的指针,因此您只需提供指向数组的指针。
请注意,发送8 KB数据报非常具有攻击性;它们很可能在IP层fragmented,这会对传输速度和可靠性产生负面影响。
研究“path MTU”的概念,并尝试将其用于发送,但它可能会更快,尽管它会产生更多的数据报。
答案 1 :(得分:4)
实际上UDP报头上的长度字段是16位,因此UDP数据报可以达到~65k(减去报头内容的大小)。
然而,正如unwind指出的那样,它很可能在整个路径上分散,以适应通往目的地的路径上的最小MTU。
8192字节是Windows操作系统的默认接收缓冲区大小。如果您使用以太网,则MTU为likely 1500 bytes。任何大于该数据报的UDP数据报都将被分段。如果您的数据报遇到路径上设备甚至更小的MTU,它将再次碎片化。
答案 2 :(得分:3)
您可以使用QByteArray.mid(int start, int len)
方法(see documentation here)从len
开始获取长度为start
的QByteArray。
只需设置len
您的数据报大小,然后从0*len
,1*len
,2*len
开始,......直到发送完所有内容。