Прежде всего, вы должны считать вещание устаревшим, особенно INADDR_BROADCAST
(255.255.255.255). Ваш вопрос выдвигает на первый план именно одну из причин, почему трансляция не подходит. Он должен умереть вместе с IPv4 (надеюсь). Обратите внимание, что IPv6 даже не имеет понятия широковещания (вместо этого используется многоадресная передача).
INADDR_BROADCAST
ограничено локальной ссылкой. В настоящее время используется только для автоматической настройки DHCP, поскольку в это время клиент еще не будет знать, к какой сети он подключен.
С одним sendto()
генерируется только один пакет, и исходящий интерфейс определяется таблицей маршрутизации операционной системы (ip route
в linux). У вас не может быть одного sendto()
, генерирующего более одного пакета, вам придется перебирать все интерфейсы и либо использовать необработанные сокеты, либо привязывать сокет к устройству, используя setsockopt(..., SOL_SOCKET, SO_BINDTODEVICE, "ethX")
для отправки каждого пакета в обход таблицы маршрутизации ОС. (это требует привилегий root). Не хорошее решение.
Вместо этого, поскольку INADDR_BROADCAST
в любом случае не маршрутизируется, вы можете достичь почти того же самого, перебирая каждый интерфейс и отправляя пакет на его широковещательный адрес. Например, предполагая, что ваши сети имеют маски 255.255.255.0 (/ 24), широковещательные адреса: 192.168.1.255 и 192.168.2.255 . Позвоните sendto()
один раз для каждого из этих адресов, и вы достигнете своей цели.
Редактировать: исправлена информация, касающаяся INADDR_BROADCAST
, и дополнить ответ информацией о SO_BINDTODEVICE
.