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