2010-12-11 85 views
4

我正在通過TCP寫一個文件傳輸程序。IP在Mac OS上不要碎片位

我想設置IP

的不分段標誌的插座上,這是我想做的事:

int val = 1; 
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val)); 

然而IP_DONTFRAG似乎在Mac OS上不提供。我錯過了什麼嗎?或者我忘了正確包含它?

在此先感謝,如果有人知道

--Sam

回答

2
+0

不幸的是,該線程中的下一條消息指出,這隻適用於RAW套接字,這不是海報所要求的:http://lists.apple.com/archives/macnetworkprog/2006/Jul/msg00017 .html – NPE 2010-12-11 07:59:26

+0

對,我現在看到了。謝謝。但是接下來的回覆表明,可能沒有其他的方式來做到這一點。 – 2010-12-11 08:04:33

+0

我看到了,但我希望避免使用原始套接字。我認爲這一定是可能的,因爲當我在網絡上捕獲數據包時,通過os x使用的tcp mecanism進行的數據傳輸具有該標誌。我猜測他們這樣做是爲了獲得一些速度,這將適合我目前的發送機制。 – thewormsterror 2010-12-11 09:51:17

0

Don't Fragment位通常是所有TCP數據包設置反正。你不必做任何特殊的事情來實現這一點。

1

DF位通常用於path MTU (PMTU) discovery由操作系統自動通過TCP連接。如果有的話,你可能會有一個套接字選項來禁用PMTU發現,它會產生從不設置DF的效果(這是Linux上的IP_MTU_DISCOVER套接字選項)。如果您離開PMTU發現,它將具有始終設置DF的效果。

因爲您使用TCP和TCP操作段而不是數據包,所以在逐個數據包的基礎上設置/取消設置是沒有意義的。如果你想設置分組級別的東西,你需要使用低層協議。

+0

對於像VPN這樣的情況,TCP-over-TCP – PnotNP 2017-05-03 21:28:11