2011-10-06 2 views
2

I Установка сырым Packet сокет, используя следующие:Набор IP_HDRINCL с ошибкой PF_PACKET в Linux

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

Я не уверен в этом (вообще), но действительно ли этот вариант имеет смысл для сокетов PF_PACKET? – Mat

+0

Я тоже не знаю ... это чужой код, с которым я работаю. Могу я задать вопрос? Я понимаю, что ядро ​​не добавляет никаких заголовков ip при правильном использовании PF_PACKET? Является ли ядро ​​добавлением заголовков или мы должны сделать это вручную? Вещи, такие как адрес источника и адрес назначения и т. Д.? Спасибо – mtahmed

+0

Да, я понимаю, что сокеты PF_PACKET не получат заголовки, добавленные ядром, но не уверен, что до уровня «OSI». Вам придется сделать их сами (и прочитать документы, чтобы точно определить, какие заголовки вам нужно иметь). – Mat

ответ

3

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

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

1

можно сделать следующим образом, вместо:

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

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