2011-11-29 15 views
11

Tengo un servicio que crea un ServerSocket y se une a localhost:7060. Cuando hice "netstat -an" en mi dispositivo Android, veo que está usando ipV6 localhost en lugar de ipv4 localhost interface.¿Por qué mi servicio siempre se vincula a ipv6 localhost en lugar de ipv4?

La salida es la siguiente:
tcp6 0 0 :: ffff: 127.0.0.1: 7060 ::: * LISTEN

Los puertos que utilizan IPv4 son enumerados como esto:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* ESCUCHAR

¿Cuál es el truco para obligarlo a usar IPv4 siempre? Estoy configurando una regla de reenvío de puertos usando iptables. La versión que tengo admite direcciones de destino ipv4.

Así es como estoy creando mi código de Java para escuchar en el puerto.

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

que siguieron otros consejos como el establecimiento propiedad del sistema a preferir IPv4 en el inicio de mi servicio. Eso no hizo ninguna diferencia.

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

Estoy funcionando esto en Android 2.3 integrado para un dispositivo integrado.

Actualización: Comprobé las fuentes de InetAddress.java en el árbol de Android. Está leyendo la bandera de arriba con una línea como a continuación.

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

Ahora no estoy seguro System.setProperty() llamada está realmente cambiando el valor leído por código de seguridad.

+0

Creo que esas propiedades del sistema están en el sistema operativo en sí, y cambiarlas programáticamente no se pegará (porque todas las aplicaciones dependen de las mismas propiedades del sistema). –

+2

(Dado que este hilo más antiguo fue referenciado en otro lugar, creo que se necesita alguna aclaración). ':: 1' es la dirección del servidor local IPv6. ':: ffff: 127.0.0.1' no lo es, es la dirección IPv4 localhost en notación IPv6 (una dirección IPv6 denominada" IPv4-mapped "). Se utiliza para sockets de doble pila que pueden aceptar paquetes IPv4 e IPv6. (Aunque un socket debe etiquetarse como 'tcp46', entonces.) – Dubu

Respuesta

2

En teoría, un servidor IPv6 también escucha IPv4, ya que el espacio de direcciones IPv4 es un subconjunto de IPv6, ¿le está causando problemas reales?

Un truco que podría funcionar es usar "127.0.0.1" en lugar de "localhost", que tiene direcciones IPv4 e IPv6 asociadas.

Cuestiones relacionadas