Java: Как я могу получить IP локального интерфейса, который может достичь удаленного IP? - PullRequest
4 голосов
/ 08 июня 2010

У меня есть приложение Java, которое регистрирует серверный компонент в поставщике услуг, а затем отправляет имя службы клиенту. Клиент использует имя службы для получения адреса от поставщика услуг на сервер. Тем не менее, сервер имеет несколько интерфейсов, только один из которых получает клиент, поэтому служба должна быть зарегистрирована с правильным IP. Мы обнаружили клиента через широковещательную рассылку, поэтому у меня есть IP-адрес клиента и перечень сетевых интерфейсов компьютеров. Как мне сопоставить IP с интерфейсом, не зная, что такое маска IP клиента?

Спонтанно я представляю, как превращаю все адреса в целочисленные и сжимаю локальные ips с помощью их маски сети и ищу «лучшее совпадение», но мне интересно, есть ли лучший способ?

(это решение для предприятий (tm), поэтому исключение поставщика услуг не вариант, по крайней мере, во-первых, без политической кампании;))

Ответы [ 4 ]

2 голосов
/ 28 июня 2010

Насколько я понимаю, поставщик услуг имеет интерфейсы в нескольких различных сетях. Каждый клиент находится только в одной из этих сетей и, следовательно, может общаться только с одним из интерфейсов. Служба должна выяснить, какой из интерфейсов доступен клиенту, чтобы он мог отправить правильный адрес. Вы (разработчик службы) не можете контролировать сетевую среду, в которой развернута служба, и, следовательно, не можете использовать решения сетевого уровня, такие как DNS.

Во многих сетевых настройках маршрутизация симметрична. То есть маршрут от хоста A к хосту B такой же, как и от хоста B к хосту A. Если вы знаете, что это происходит во всех средах, в которых будет развернут ваш сервис, то вы можете смело предположить, что использованный адрес подключиться к клиенту доступно клиенту. Этот адрес может быть обнаружен, например, путем подключения DatagramSocket к клиенту и последующего вызова его getLocalAddress() метода.

Если маршрутизация асимметрична, я не знаю способа определить, доступен ли конкретный интерфейс клиенту, используя только java.net API. Если вы управляете реализацией клиента, возможно, вы сможете включить в него широковещательный адрес источника (который должен быть видимым для него интерфейсом сервера) в свой пакет широковещательного ответа. Кроме того, вы не включили достаточно информации о сценарии, чтобы дать конкретный совет. Например, было бы полезно узнать, какой протокол используется для широковещательной рекламы и ответа клиента на нее.

0 голосов
/ 08 июня 2010

Обычно это делается с помощью DNS. Интерфейс должен быть указан в DNS, чтобы к нему можно было обращаться по имени, а не по адресу servicehost.example.com, а не по 192.0.2.42.

0 голосов
/ 23 июня 2010

Это скорее проблема сетевого администрирования, чем приложения.

Предположим, что сервер (на котором размещено приложение Java) является многодомным. это может быть три адреса: 1. 99.88.77.66 (публичный IP) 2. 10.10.10.10 (Частный, Внутренне назначенный IP)

Какой IP-адрес получит ваш потенциальный клиент, зависит от конфигурации сети.

Клиент может получить доступ с общедоступного IP-адреса, но он получит доступ к вашему частному IP-адресу из-за NAT. Другой пример, может быть ваш IP-адрес клиента 192.168.10.10, через NAT он получает доступ к вашему 10.10.10.10 IP.

Невозможно рассчитать правильный IP-адрес (для публикации вашего сервиса) по любому типу сопоставления префиксов.

Вы упомянули, что это корпоративное решение, и сложная конфигурация сети распространена в такой среде.

При использовании DNS вашим сервером может быть myapp.company.com. Именно DNS-сервер может определить правильный IP-адрес для клиента. Возможно, вам нужно будет связаться с сетевым парнем, с надлежащей поддержкой в ​​DNS, решение должно быть тривиальным и более надежным.

0 голосов
/ 08 июня 2010

Это зависит от того, как вы собираетесь это сделать.

Пример кода намного?

Для InetAddress существует метод ".getHostAddress ()", который может быть полезен.

...