Почему моя служба всегда привязывается к ipv6 localhost вместо ipv4?

У меня есть служба, которая создает 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); {{ 1}}

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

11
задан videoguy 30 November 2011 в 03:24
поделиться