Как привязать к одному и тому же порту UDP на нескольких интерфейсах
У меня есть два сетевых интерфейса, и я пытаюсь привязаться к одному и тому же порту UDP на обоих из них, но я получаю ошибку, когда я пытаюсь привязаться ко второму, EADDRINUSE
. Когда я привязываюсь к сокетам, я передаю sockaddr*
, где я настроил порт и уникальный IP-адрес для использования.
Должен ли я использовать опцию сокета SO_REUSEADDR
? Позволит ли это получать сообщения на любом сокете или они будут отправляться в сокет, соответствующий IP-адресу, к которому они привязаны?
1 ответ:
Вы можете
bind(2)
один сокет дляINADDR_ANY
для IPv4 или дляin6addr_any
для IPv6 (вам не нужно, но это обычный подход). Это сделает этот единственный сокет способным принимать пакеты от всех сетевых интерфейсов на коробке.Тогда
SO_REUSEADDR
опция сокета позволит вам привязать другие сокеты кболее конкретным адресам , то есть к отдельным интерфейсам и тому же порту.Пакеты будут приниматься на сокет, который привязан к адресу лучше всего. соответствие IP-адресу назначения данного пакета.