Тип адреса сокета из recvfrom () с помощью AF_PACKET / PF_PACKET - PullRequest
3 голосов
/ 26 мая 2011

На двух ПК я открываю сокет AF_PACKET / PF_PACKET, необработанный протокол.

sock = socket (AF_PACKET, SOCK_RAW, htons (PROTO_BULK))

(редактировать: PROTO_BULK - фиктивный тип, созданный мной для этого теста. Я неожидаю, что это приведет к этой проблеме, но я могу ошибаться.)

Первый ПК отправляет пакет другому стандартному пути send (), который получен на другой стороне с помощью:

recvfrom (sock, buffer, 1600, 0, (struct sockaddr *) & from, & fromlen);

Моя проблема сейчас: какой тип данных в "from«?Вот пример того, что я получаю:

00 00 00 00 00 00 00 00 f8 cd a1 00 58 1d a1 00 94 60

Из длины исодержимое не похоже ни на «struct sockaddr», ни на «sockaddr_ll».Любая идея?

Я на самом деле ищу интерфейс, на котором был получен пакет.Я мог бы использовать MAC-адрес назначения из пакета и определить интерфейс от него, но он не будет работать с широковещательным пакетом.

Я использую последнее ядро ​​Linux (и я не хочу исследовать ядроисточники!).

Редактировать: Мой код был неправильным.Я не инициализировал «fromlen» с «from» размером буфера, поэтому я предположил, что там было какое-то поддельное значение, и «recvfrom ()» не мог правильно выполнять свою работу.Спасибо Бену Фойгту за то, что он указал мне на эту ошибку с его комментарием ниже!Конечно, я не включил эту часть неисправного кода в свой вопрос, поскольку было очевидно, что с таким простым кодом не может быть ошибки ...

При правильном параметре я получаю "struct sockaddr_ll"правильно заполнен, включая номер интерфейса, который я искал.

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Я на самом деле ищу интерфейс, на котором был получен пакет.

Вы должны использовать recvmsg, который дает доступ к метаданным, таким как адрес назначения пакета (полезно для многосетевых систем), а также, я думаю, и интерфейс.

Адрес отправителя, который вы сейчас просматриваете, не будет сообщать вам интерфейс. Это хорошо для отправки пакета ответа с sendto, хотя.

1 голос
/ 26 мая 2011

Я взглянул на исходники ядра. Я не утверждаю, что полностью понимаю их, но ...

PROTO_BULK 37984 (0x9460)?

Если это так, то это, вероятно, "struct sockaddr_pkt". (В любом случае он имеет правильный размер.) Хотя я не уверен, что означают другие байты. Если я правильно читаю код, они должны быть «именем» интерфейса, на котором был получен пакет. Вероятно, я неправильно читаю код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...