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

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

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


person geniusburger    schedule 22.11.2012    source источник
comment
Можете ли вы показать код, пожалуйста? очень трудно что-либо сказать, не видя этого.   -  person Some programmer dude    schedule 22.11.2012


Ответы (1)


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

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

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

person Nikolai Fetissov    schedule 22.11.2012
comment
Итак, нужно ли создавать 1 сокет для «любого» и несколько сокетов для определенных адресов? - person d.moncada; 22.11.2012
comment
Вы можете просто сделать один сокет для всех интерфейсов. Это просто. Вам нужны разные сокеты только в том случае, если обработка/функциональность отличаются, или вам нужно разделить приложения (например, в среде хостинга). - person Nikolai Fetissov; 22.11.2012