Я работаю с кластером из примерно 40 узлов, работающих под управлением Debian 4. Каждый узел запускает демон, который сидит и прослушивает многоадресный IP-адрес.
Я написал некоторое клиентское программное обеспечение для отправки многоадресной рассылки по локальной сети с клиентским компьютером на том же коммутаторе, что и кластер, чтобы каждый узел в кластере получал пакет и отвечал.
Это прекрасно работает, за исключением случаев, когда я запускаю клиентское программное обеспечение на компьютере с интерфейсами LAN и WAN. Если есть интерфейс WAN, многоадресная рассылка не работает. Очевидно, я полагаю, что многоадресная рассылка неправильно проходит через интерфейс WAN (eth0), а не LAN (eth1.) Итак, я использую опцию сокета SO_BINDTODEVICE, чтобы заставить сокет многоадресной рассылки использовать eth1, и все хорошо. *
Но я подумал, что таблица маршрутизации ядра должна определить, что LAN (eth1), очевидно, является более дешевым местом назначения для многоадресной рассылки. Есть ли какая-то причина, по которой я должен явно заставить сокет использовать eth1? И есть ли какой-то способ (возможно, вызов ioctl), чтобы приложение могло автоматически определять, является ли конкретный интерфейс локальной или глобальной сетью?