2011-12-01 46 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的路由設備,它將再次被分段。

相關問題