在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);
}
由于
答案 0 :(得分:1)
我在发布这个问题后找到了解决方案: - (...: - )......
解决方案是使用inet:setopts()
设置套接字原始选项,就像在C语言中所做的那样,但区别在于您需要知道IPPROTO_IP
和IP_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
感谢。