Я работал над службой локальной сети, которая использует многоадресный порт для координации нескольких машин.Каждая машина прослушивает многоадресный порт для получения инструкций, и при получении определенной инструкции будет отправлять сообщения непосредственно на другие машины.
Другими словами, многоадресный порт используется для координации одноранговых сообщений UDP.
На практике это работает довольно хорошо, но есть проблема, связанная с правильной настройкой этих одноранговых передач.По сути, каждая машина должна объявить на многоадресном порту свой собственный IP-адрес, чтобы другие машины знали где для отправки сообщений, когда они хотят начать передачу P2P.
Я понимаю, что вВ общем, идея определения локального IP-адреса не обязательно разумна , но я не вижу другого пути - локальный принимающий IP-адрес должен быть объявлен так или иначе.По крайней мере, я не работаю в интернете, поэтому в целом мне не нужно беспокоиться о NAT, просто нужно определить IP локальной сети.(Для многоадресных пакетов допускается не более 1 прыжка.)
Я хотел, если возможно, определить IP-адрес пассивно, т. Е. Без отправки каких-либо сообщений.Я использовал код, который вызывает getifaddrs()
, который возвращает связанный список сетевых адаптеров на машине, и я сканирую этот список на ненулевые IP-адреса и выбираю первый.
В целом это сработалохорошо, но у нас были проблемы, когда, например, активна машина с проводным и Wi-Fi-соединением, она будет определять неправильный, и единственный найденный способ - отключить Wi-Fi.
Теперь я полагаю, что более надежным решением было бы отправить сообщение на многоадресную рассылку, сообщая другим машинам, чтобы они сообщали с исходным адресом сообщения;это может позволить определить, какой IP-адрес действительно виден другим компьютерам в сети.В качестве альтернативы, может быть, даже просто посмотреть на сообщение многоадресной обратной связи.
Как вы думаете, существуют ли пассивные решения для определения того, какой адрес использовать?Если нет, то какое лучшее активное решение?
Я использую API сокетов POSIX от C. Должен работать в Linux, OS X, Windows.(Для Windows я использовал GetAdapterAddresses()
.)