Как изменить флаг "Не фрагментировать" (DF) для UDP-пакета в Erlang?
В Эрланге очень просто отправить UDP
пакет, то есть использовать gen_udp:open()
создать сокет, затем использовать gen_udp:send()
отправить данные.
Однако по умолчанию Linux TCP/IP
Стек установит флаг не фрагментировать (DF) в заголовке IP, если размер IP-пакета не превышает размер MTU. Если размер превышает MTU
размер, UDP
Пакет будет фрагментирован.
Есть ли способ не устанавливать флаг DF для UDP
только пакет?
Я знаю на языке C, следующий код может быть использован для очистки флага DF. Но я не смог найти выход в Эрланге.
int optval=0;
if(-1 == setsockopt(sockfd,IPPROTO_IP,IP_MTU_DISCOVER,&optval,sizeof(optval))) {
printf("Error: setsockopt %d\n",errno);
exit(1);
}
Спасибо
1 ответ
Я нашел решение после того, как разместил этот вопрос:-(...:-)...
Решение состоит в том, чтобы установить опцию необработанного сокета, используя inet:setopts()
как то, что делается на языке Си, но разница в том, что вам нужно знать определение IPPROTO_IP
а также IP_MTU_DISCOVER
,
Значение IPPROTO_IP
равно 0, определено в netinet / in.h значение IP_MTU_DISCOVER
равно 10, определено в linux/in.h
Ниже приведен пример. Inet:setopts(гнездо,[{сырой,0,10,<<0:32/ родной >>}]).
Я проверил это с помощью небольшой программы, она работает.
Вы можете найти подробную помощь для inet:setopts
на справочной странице erlang: http://www.erlang.org/doc/man/inet.html
Благодарю.