2010-12-11 84 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