如何更改 Erlang 中 UDP 数据包的不分段 (DF) 标志?



在Erlang中,发送UDP数据包非常简单,即使用gen_udp:open()创建一个套接字,然后使用gen_udp:send()发送数据。

但是,默认情况下,如果IP数据包的大小不超过MTU大小,Linux TCP/IP堆栈将在IP标头中设置不分段(DF)标志。如果大小超过MTU大小,则UDP数据包将被分段。

有没有办法不为UDP数据包设置DF标志?

我知道在C语言中,下面的代码可以用来清除DF标志。但是我在二郎找不到路。

int optval=0;
if(-1 == setsockopt(sockfd,IPPROTO_IP,IP_MTU_DISCOVER,&optval,sizeof(optval))) {
    printf("Error: setsockopt %dn",errno);
    exit(1);
}

感谢

我在发布这个问题后找到了解决方案:-(…:-)…

解决方案是像在C语言中那样使用inet:setopts()来设置套接字原始选项,但不同的是,您需要知道IPPROTO_IPIP_MTU_DISCOVER的定义。

IPPROTO_IP的值为0,定义为netinet/in.hIP_MTU_DISCOVER的值是10,在linux/in.h 中定义

以下是示例。inet:setopts(套接字,[{raw,0,10,<<0:32/native>>}])。

我已经用小程序测试过了,它正在工作。

您可以在erlang手册页上找到inet:setopts的详细帮助:http://www.erlang.org/doc/man/inet.html

谢谢。