Как привязать к одному и тому же порту UDP на нескольких интерфейсах


У меня есть два сетевых интерфейса, и я пытаюсь привязаться к одному и тому же порту UDP на обоих из них, но я получаю ошибку, когда я пытаюсь привязаться ко второму, EADDRINUSE. Когда я привязываюсь к сокетам, я передаю sockaddr*, где я настроил порт и уникальный IP-адрес для использования.

Должен ли я использовать опцию сокета SO_REUSEADDR? Позволит ли это получать сообщения на любом сокете или они будут отправляться в сокет, соответствующий IP-адресу, к которому они привязаны?

1 2

1 ответ:

Вы можете bind(2) один сокет для INADDR_ANY для IPv4 или для in6addr_any для IPv6 (вам не нужно, но это обычный подход). Это сделает этот единственный сокет способным принимать пакеты от всех сетевых интерфейсов на коробке.

Тогда SO_REUSEADDR опция сокета позволит вам привязать другие сокеты кболее конкретным адресам , то есть к отдельным интерфейсам и тому же порту.

Пакеты будут приниматься на сокет, который привязан к адресу лучше всего. соответствие IP-адресу назначения данного пакета.