如何在Erlang中更改UDP数据包的don-t片段(DF)标志?

时间:2015-06-24 05:21:22

标签: erlang udp mtu ip-fragmentation

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

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

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

我知道在C语言中,可以使用以下代码清除DF标志。但我无法在Erlang中找到方法。

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

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

以下是示例。 INET:setopts(插座,[{原料,0,10,<< 0:32 /天然的GT;>}])。

我已经使用小程序对它进行了测试,它正在运行。

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

感谢。