2011-11-29 8 views
11

Ho un servizio che crea un ServerSocket e si collega a localhost:7060. Quando ho fatto "netstat -an" sul mio dispositivo Android, vedo che sta usando ipV6 localhost invece dell'interfaccia localhost ipv4.Perché il mio servizio si collega sempre a ipv6 localhost invece di ipv4?

L'output è così:
tcp6 0 0 :: ffff: 127.0.0.1: 7060 ::: * LISTEN

Le porte che utilizzano IPv4 è elencato simili:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* ASCOLTA

Qual è il trucco per forzare l'utilizzo di IPv4 sempre? Sto impostando una regola di port forward usando iptables. La versione I supporta indirizzi di destinazione IPv4.

Ecco come sto creando il mio codice Java per l'ascolto sulla porta.

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

ho seguito altri consigli come impostazione proprietà di sistema a preferire IPv4 l'avvio del mio servizio. Questo non ha fatto alcuna differenza.

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

Sto facendo funzionare questo su Android 2.3 costruito per un dispositivo embedded.

Aggiornamento: Ho controllato i sorgenti di InetAddress.java nell'albero di Android. Sta leggendo la bandiera sopra con una linea come sotto.

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

Ora io non sono sicuro System.setProperty() chiamata è davvero cambiando il valore letto dal codice di cui sopra.

+0

Penso che quelle proprietà di sistema siano nel sistema operativo stesso e che la loro modifica programmatica non si attacchi (poiché tutte le app dipendono dalle stesse proprietà di sistema). –

+2

(Poiché questo thread precedente è stato fatto riferimento altrove, penso che siano necessari alcuni chiarimenti.) ':: 1' è l'indirizzo localhost IPv6. ':: ffff: 127.0.0.1' non lo è, è l'indirizzo IPv4 localhost in notazione IPv6 (un cosiddetto indirizzo IPv6" mappato IPv4 "). Viene utilizzato per socket dual-stack che possono accettare sia i pacchetti IPv4 che IPv6. (Anche se un socket dovrebbe essere etichettato come 'tcp46', quindi.) – Dubu

risposta

2

In teoria un server IPv6 ascolta anche IPv4, dal momento che lo spazio degli indirizzi IPv4 è un sottoinsieme di IPv6, questo sta causando problemi reali?

Un trucco che potrebbe funzionare è utilizzare "127.0.0.1" invece di "localhost", che ha indirizzi IPv4 e IPv6 associati.

Problemi correlati