Как изменить флаг "Не фрагментировать" (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

Благодарю.

Другие вопросы по тегам