2012-07-06 44 views
1

我正在調用一個有效地址的recvfrom api,在那裏我試圖讀取大小爲9600字節的數據,緩衝區我提供了我的大小12KB,我甚至沒有選擇閱讀事件。 即使嚴格推薦的MTU大小是1.5 KB,我可以發送和接收4 KB的數據包。套接字UDP recvfrom不適用於大數據包,即使緩衝區給定足夠在LINUX上

我正在使用android NDK(Linux)進行開發。

請幫忙。有沒有一個套接字選項,我必須設置爲讀取大型緩衝區?

回答

0

如果發送的數據包比MTU大,它將是fragmented。也就是說,它會被分成更小的部分,每個部分都適合MTU。問題是,如果即使其中一個丟失(很可能在蜂窩連接上...),整個數據包也將消失。

要確定是否屬於這種情況,您需要在連接的一端(或兩端)使用數據包嗅探器。 Wireshark是PC端的好選擇,或者android端的tcpdump(你需要root)。請記住,家庭路由器可能會重新組合碎片數據包 - 這意味着如果您正在從家庭路由器/防火牆內嗅探數據包,您可能看不到任何碎片到達,直到它們全部到達路由器(並且顯然如果有一些碎片失去這個不會發生)。

更好的選擇是簡單地確保始終發送小於MTU的數據包。碎片幾乎不是正確的做法。請記住,服務器和客戶端之間的路徑MTU可能會有所不同 - 您可以使用少於1500的常見選項(1400應該是安全的),或者嘗試通過setting the MTU discovery flag on your UDP packets(通過IP_MTU_DISCOVER)並始終發送小於getsockoptIP_MTU選項返回的值(包括重發!)

+0

感謝您的回覆。我將檢查套接字選項 – FunnyName 2012-07-10 04:00:03

相關問題