Как изменить флаг «Не фрагментировать» (DF) для UDP-пакета в Erlang?

В Erlang очень просто отправить пакет UDP, то есть использовать gen_udp:open() для создания сокета, а затем использовать gen_udp:send() для отправки данных.

Однако по умолчанию стек Linux TCP/IP устанавливает флаг «не фрагментировать» (DF) в заголовке IP, если размер IP-пакета не превышает размер MTU. Если размер превышает размер MTU, пакет UDP будет фрагментирован.

Есть ли способ не устанавливать флаг DF только для пакета UDP?

Я знаю, что на языке 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);
}

Спасибо


person mailzyok    schedule 24.06.2015    source источник


Ответы (1)


я нашел решение после того, как разместил этот вопрос :-(...:-)...

Решение состоит в том, чтобы установить необработанную опцию сокета, используя inet:setopts(), как это делается в языке C, но разница в том, что вам нужно знать определение IPPROTO_IP и IP_MTU_DISCOVER.

Значение IPPROTO_IP равно 0, определенное в netinet/in.h Значение IP_MTU_DISCOVER равно 10, определенное в linux/in.h

Ниже приведен пример. inet:setopts(Socket,[{raw,0,10,‹‹0:32/native>>}]).

Я проверил это с помощью небольшой программы, она работает.

Вы можете найти подробную справку по inet:setopts на справочной странице erlang: http://www.erlang.org/doc/man/inet.html

Спасибо.

person mailzyok    schedule 24.06.2015