Установите IP_HDRINCL с ошибкой PF_PACKET в Linux - PullRequest
2 голосов
/ 06 октября 2011

Я устанавливаю сокет необработанного пакета, используя следующее:

sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );

Затем я пытаюсь установить опцию сокета IP_HDRINCL, используя:

int one = 1;
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
    LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n");

Но я не могу установить эту опцию (я получаю сообщение об ошибке с errno 92 и сообщением «Протокол недоступен». Если я изменяю PF_PACKET на PF_INET, то параметры устанавливаются, но я должен использовать PF_PACKET. Так есть ли способ установить эту опцию с сокетом, созданным выше?

Спасибо большое.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011
У сокетов

PF_PACKET нет опций, которые я задал в вопросе, который нужно задать. Эта опция доступна только для сокетов PF_INET или PF_INET6 с типом SOCK_RAW.

Если кто-то хочет, чтобы заголовки IP были добавлены ядром, он должен использовать сокет PF_INET.

1 голос
/ 01 декабря 2013

Вместо этого вы можете сделать следующее:

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

Это означает, что сокет является необработанным сокетом с установленным IP_HDRINCL. Если вы используете getsockopt для проверки значения сокета, вы увидите, что IP_HDRINCL уже установлен.

...