Проблемы с Linux SO_BINDTODEVICE снабжают опцию сокетом

Мне нравится gotapi.com забастовка> (Обновление 2: Сайт по-видимому в режиме офлайн - Использование другой ресурс такой как MDN)

Обновление: исходный ответ был с 2008 - сегодня я скажу для проверки Сеть разработчиков Mozilla (как многие другие также сказали).

15
задан Jonathon Reinhart 20 May 2014 в 01:07
поделиться

4 ответа

Просто найдите IP-адрес интересующего вас интерфейса с помощью getifaddrs () и привяжите свой сокет к этому IP-адресу с помощью bind (). Если вы включите SO_BROADCAST на сокете, вы будете получать широковещательные сообщения только на этом интерфейсе.

Или вы можете пропустить часть getifaddrs () и, если хотите, просто привязать () к 192.168.7.1.

2
ответ дан 1 December 2019 в 01:17
поделиться

Проблема, с которой я столкнулся, похоже, заключается в том, что получение широковещательных сообщений из определенного интерфейса обрабатывается по-разному в Linux, Windows, ... http://www.developerweb.net/forum/showthread.php?t=5722

Теперь я решил решить проблему (небольшая документация и плохая переносимость), изменив стек TCP / IP микроконтроллера. Он больше не будет отправлять ответы на широковещательный адрес, а вместо этого будет принимать IP / MAC из входящего пакета UDP в качестве IP / MAC назначения. Затем я могу (на стороне компьютера) просто привязать сокет к IP-адресу eth1.

Ура, Майкл

2
ответ дан 1 December 2019 в 01:17
поделиться

Ответ на вопрос 2 кажется, что getsockopt просто не поддерживается для опции SO_BINDTODEVICE. В исходном коде ядра Linux (2.6.27) этот параметр обрабатывается только в функции sock_setsockopt в linux-2.6.27.25-0.1 / net / core / sock.c

Для вопроса 3, похоже, многие люди рекомендуют " Сетевое программирование UNIX »У. Ричарда Стивенса. Я просмотрел страницы параметров сокетов онлайн-версии книги Google - параметр SO_BINDTODEVICE не указан в таблицах 7.1 и 7.2 :-( ... может быть, потому что эта опция предназначена только для Linux?

1
ответ дан 1 December 2019 в 01:17
поделиться

Хорошо, я изучил это еще немного. SO_BINDTODEVICE считался «почти устаревшим» еще в 1999 году и предназначен только для root-прав из-за некоторых неуказанных «последствий для безопасности» (я не мог точно выяснить, что именно).

Однако вы должны иметь возможность получить желаемое поведение путем привязки к INADDR_ANY и установки параметра сокета IP_PKTINFO. Это передаст дополнительное сообщение в сокет, которое содержит структуру pktinfo, описывающую входящий пакет. Эта структура включает индекс интерфейса, на который пришел пакет:

struct in_pktinfo {
    unsigned int   ipi_ifindex;  /* Interface index */
    struct in_addr ipi_spec_dst; /* Local address */
    struct in_addr ipi_addr;     /* Header Destination address */
};

ipi_ifindex совпадает с ifr_ifindex из структуры ifreq, возвращаемой ioctls netdevice, например SIOCGIFCONF. Таким образом, вы должны иметь возможность использовать это, чтобы игнорировать пакеты, полученные на интерфейсах, отличных от того, который вас интересует.

7
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: