1

在 Erlang 中,发送数据包很简单UDP,就是gen_udp:open()用来创建一个套接字,然后gen_udp:send()用来发送数据。

但是,默认情况下,TCP/IP如果 IP 数据包的大小不超过 MTU 大小,Linux 堆栈将在 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);
}

谢谢

4

1 回答 1

1

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

inet:setopts()解决方法是像 C 语言一样设置 socket raw 选项,但不同的是你需要知道IPPROTO_IP和的定义IP_MTU_DISCOVER

的值为IPPROTO_IP0,定义在netinet/in.h 的值为IP_MTU_DISCOVER10,定义在linux/in.h

下面是例子。inet:setopts(Socket,[{raw,0,10,<<0:32/native>>}])。

我已经使用小程序对其进行了测试,它可以正常工作。

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

谢谢。

于 2015-06-24T06:27:21.123 回答