2010-07-20 112 views
10

我知道默認的最大緩衝區大小可以用於這些函數65507(5535 - IPv4標頭 - UDP標頭)。但是,有沒有辦法改變這一點?我需要能夠發送更大的緩衝區〜66000字節。我嘗試使用setsockopt()函數,但它似乎沒有工作。UDP sendto()和recvfrom()最大緩衝區大小

謝謝!

+0

難道你不能分割你的緩衝區,用額外的位標記它來知道順序嗎? – Scharron 2010-07-20 16:44:21

+0

這看起來像我不得不想出這樣的計劃。 – 2010-07-20 16:50:15

+1

5535應該是65535 – kumar 2014-10-10 12:08:35

回答

12

UDP只提供了一個數據報作爲一個IP包的數據部分,一個IP包具有這樣的數據限制到2^16字節,包括標頭,或65507個字節16比特長度字段UDP數據部分(假設沒有ipv4選項),除了將數據分成多個數據包並自行處理重組外,沒有辦法使用UDP處理更大的數據包。

+0

感謝您的澄清。 – 2010-07-20 16:50:32

6

UDP規範在數據包大小的UDP報頭中提供了16位,這意味着您不能一次發送超過65k。你不能改變這一點。

你必須將你的數據分成多個數據包。 使用TCP而不是UDP會使事情變得簡單多了,因爲保證了完整性和接收順序。

+1

+1代替建議TCP。 – Matt 2011-12-12 09:01:08

8

此外,它很可能會丟失「大」的UDP數據包,因爲封裝的IP數據包可能因爲限制而被分段。每個片段可能會丟失,UDP中沒有恢復機制。所以雖然UDP有效載荷的理論限制是大約。 64kB的實際限制是1kB左右。

+4

這是一個重要的觀點。一個65500字節的UDP數據包被分割成以太網大小的片段,將使1%的基礎片段丟失率變成大約37%的UDP數據包丟失率。大UDP包 - 不要這樣做! – caf 2010-07-20 23:17:45

+0

我在哪裏工作,通過在私有子網上使用專用接口來處理UDP數據包(和靜態ARP條目以防止週期性ARP丟棄),從而解決了此問題。如果您不能這樣做,請爲丟棄的數據包做好準備。 – 2012-07-23 19:05:38