Как я могу получить IPv4 из ServerSocket? - PullRequest
2 голосов
/ 12 декабря 2011

В моем приложении я создаю ServerSocket и жду соединения:

while(isRunning) {
    try {
        socket = serverSocket.accept();

Затем я пытаюсь получить удаленный IP-адрес полученного сокета:

socket.getInetAddress().getHostAddress();

Однако, похоже, это возвращает только адрес IPv6.

Я считаю, что для моих целей мне нужен IPv4. Есть ли способ получить адрес IPv4 из сокета?

Ответы [ 3 ]

1 голос
/ 29 июля 2012

не знаю, уже слишком поздно или нет, но этот маленький кусочек кода может решить вашу проблему. У меня была такая же проблема сегодня, и я нашел это:

private String getLocalIpAddress() {
   try {
       for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
           NetworkInterface intf = en.nextElement();
           for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
               InetAddress inetAddress = enumIpAddr.nextElement();
               if (!inetAddress.isLoopbackAddress()) {
                   if (inetAddress instanceof Inet4Address) {
                       return ((Inet4Address)inetAddress).getHostAddress().toString();
                   }
               }
           }
       }
   } catch (SocketException ex) {
       Log.e("ServerActivity", ex.toString());
   }
   return null;
}

Суть в том, чтобы проверить, является ли IP-адрес действительно IP-адресом V4.

Веселись

0 голосов
/ 12 декабря 2011

Хотя некоторые адреса IPv6 отображаются в диапазон IPv4, невозможно преобразовать все IPv6 в IPv4, поскольку адресов IPv6 больше, чем адресов IPv4. У Oracle есть действительно хороший документ, объясняющий IPv6 и IPv4 и его влияние на Java и работу в сети. Вам также следует проверить документ InetAddress API. Я связал оба ниже:

http://docs.oracle.com/javase/1.4.2/docs/guide/net/ipv6_guide/

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/InetAddress.html

0 голосов
/ 12 декабря 2011

Если клиент подключился к IPv6-адресу (т. Е. Если ваш сервер размещен на IPv6), то у вас будет только IPv6-адрес.Вам также потребуется разместить сервер в пространстве IPv4 (или вместо него), а затем подключить клиент к IPv4-адресу, чтобы получить IPv4-адрес клиента.

Возможно, вы сможетевыполнить поиск через DNS, но это не будет надежно (т. е. выполнить обратный поиск IPv6-адреса, чтобы получить имя хоста, затем выполнить прямой поиск, ища записи A на хосте).Предполагается, что для адреса был настроен обратный DNS, что не гарантируется.

...