Координация одноранговых сообщений с использованием многоадресной рассылки, как получить IP-адрес? - PullRequest
1 голос
/ 14 октября 2011

Я работал над службой локальной сети, которая использует многоадресный порт для координации нескольких машин.Каждая машина прослушивает многоадресный порт для получения инструкций, и при получении определенной инструкции будет отправлять сообщения непосредственно на другие машины.

Другими словами, многоадресный порт используется для координации одноранговых сообщений 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().)

Ответы [ 2 ]

0 голосов
/ 28 октября 2013

Я использовал бы адрес на интерфейсе, который я использую для отправки сообщения многоадресной рассылки - на проводном интерфейсе объявите проводной адрес, а на беспроводном интерфейсе объявите беспроводной адрес.

Когда все получателив режиме реального времени на проводной стороне они никогда не увидят сообщение в беспроводной сети.

При наличии моста между проводной и беспроводной сетью добавьте второй шаг в обнаружении для оценки времени прохождения сигнала в оба конца ивключите уникальный идентификатор хоста в пакет объявления, чтобы можно было обнаружить несколько маршрутов к одному и тому же хосту и выбрать лучший.

Кроме того, было бы неплохо добавить опцию конфигурации, чтобы ограничить службуопределенные интерфейсы.

0 голосов
/ 03 сентября 2012

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

Когда прослушивающая машина получает сообщение, она, вероятно, делает это с помощью recvfrom (2).Пятый аргумент - это буфер, в который ядро ​​будет хранить адрес однорангового узла, если его предлагает базовый протокол.Поскольку вы используете IP / UDP, буфер должен заполняться sockaddr_in, показывающим IP-адрес отправителя.

...