2011-12-01 104 views
5

我需要使用udp发送和接收非常大的数据。不幸的是,udp提供了每个图8192个字节,所以需要将数据分成更小的块。我使用Qt和QUdpSocket。有一个QByteArray,我想发送给客户端,长度为921600。我想每次发送8192个字节。在UDP套接字上发送大量数据

什么是快速分裂QByteArray

+1

我有类似的问题。但是,我怀疑如果我分割数据并发送数据块,那么我是否可以收集另一端的所有数据块并获取原始字节数组?我是否需要在每个数据报上添加一些编号? –

回答

3

可以使用QByteArray.mid(int start, int len)方法(see documentation here)来获取长度len的QByteArray中从start开始。

只是让你的数据报大小len,并开始0*len1*len2*len,...直到一切都被发送。

5

你应该永远不需要明确地分割数据,只需一步步完成8 KB。通常,将数据写入套接字的函数(包括QUdpSocket::writeDatagram,似乎)接受指向第一个字节和一个字节计数的指针,因此您只需向数组中提供一个指针即可。

请注意发送8 KB数据报是相当积极的;它们很可能在IP层为fragmented,这可能负面影响传输速度和可靠性。

研究“路径MTU”的概念,并尝试将其用于发送,但它可能会更快,但它会导致更多的数据报。

4

实际上UDP头上的长度字段是16位,所以UDP数据报可以高达〜65k(减去头文件的大小)。

但是,正如unwind所指出的那样,它很可能会沿着路径分段,以适应到达目的地的最小MTU。

8192字节是Windows操作系统的默认接收缓冲区大小。如果您使用以太网,则MTU为likely 1500 bytes。任何比这更大的UDP数据报将被分割。如果你的数据报遇到了一个具有更小MTU的路由设备,它将再次被分段。