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.
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). –
(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