На двух ПК я открываю сокет 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"правильно заполнен, включая номер интерфейса, который я искал.