在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_IP
和IP_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
谢谢。