在UDP套接字上发送大数据

时间:2011-12-01 14:42:41

标签: qt udp

我需要使用udp发送和接收非常大的数据。不幸的是,udp每个图提供8192个字节,因此需要将数据分成更小的部分。 我正在使用Qt和QUdpSocket。我想发送给客户端的QByteArray长度为921600。我想每次发送8192个字节。

分割QByteArray的快捷方法是什么?

3 个答案:

答案 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*len1*len2*len开始,......直到发送完所有内容。