Почему моя служба всегда привязывается к 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);

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

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

Уловкой, которая может работать, является использование "127.0.0.1" вместо "localhost", у которого есть адреса IPv4 и IPv6.