Почему мой сервис всегда связывается с локальным хостом ipv6 вместо ipv4? - PullRequest
11 голосов
/ 30 ноября 2011

У меня есть служба, которая создает ServerSocket и привязывается к localhost:7060. Когда я выполнил команду «netstat -an» на своем устройстве Android, я вижу, что он использует ipV6 localhost вместо интерфейса ipv4 localhost.

Вывод выглядит так:
tcp6 0 0 :: ffff: 127.0.0.1: 7060 ::: * LISTEN

Порты, использующие ipV4, перечислены следующим образом:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN

Какая хитрость заставляет его всегда использовать IPv4? Я настраиваю правило перенаправления портов с помощью iptables. У меня версия поддерживает адреса назначения ipv4.

Вот как я создаю свой Java-код для прослушивания порта.

InetAddress localAddress = Inet4Address.getByName("localhost"); //InetAddress localAddress = Inet4Address.getLocalHost(); sockServer = new ServerSocket(nPort, 20, localAddress);

Я следовал другим советам, таким как установка системного свойства, чтобы предпочесть ipV4 при запуске моей службы. Это не имело никакого значения.

System.setProperty("java.net.preferIPv4Stack", "true");

Я использую Android 2.3 для встроенного устройства.

Обновление: Я проверил источники InetAddress.java в дереве Android. Это читает выше флаг со строкой как ниже.

static boolean preferIPv6Addresses() {
        String propertyName = "java.net.preferIPv6Addresses";
        String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName));
        return Boolean.parseBoolean(propertyValue);
    }

Теперь я не уверен, что вызов System.setProperty () действительно изменяет значение, прочитанное приведенным выше кодом.

1 Ответ

2 голосов
/ 10 мая 2013

Теоретически сервер IPv6 также прослушивает IPv4, поскольку адресное пространство IPv4 является подмножеством IPv6, не вызывает ли это реальных проблем у вас?"вместо" localhost ", с которым связаны адреса IPv4 и IPv6.

...