2012-04-24 4 views
6

Sto provando a scrivere un programma usando Socket e ho bisogno di ottenere il mio indirizzo IP locale.getLocalAddress() restituisce 0.0.0.0

Quando uso getLocalAddress nel socket, ottengo solo 0.0.0.0.

Ecco un piccolo pezzo del mio codice:

DatagramSocket socket; 
DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500); 
socket = new DatagramSocket(); 
System.out.println("Local address = " + socket.getLocalAddress()); 
socket.send(pacoteEnvio); 

Avete qualche idea?

Sto usando UDP, quindi non sono sicuro di poter ottenere il mio IP in questo modo perché è senza connessione, ma penso che tu possa aiutarmi!

+0

La tua presa non è vincolata, che spiega l'indirizzo 0 0 0 0 – GETah

+0

Ho provato a legarlo per un test, ma ho ricevuto il messaggio: È già collegato .. – fhbeltrami

risposta

4

Si può provare:

InetAddress ip = InetAddress.getLocalHost();

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html

DatagramSocket pubblico (int porta, InetAddress LADDR) tiri SocketException

crea un socket datagram, legato all'indirizzo del locale specificato. La porta locale deve essere compresa tra 0 e 65535 inclusi. Se l'indirizzo IP è 0.0.0.0, il socket sarà associato all'indirizzo wildcard, un indirizzo IP scelto dal kernel.

+0

non funziona ... ho provato anche io – fhbeltrami

+0

Ora Funziona. Grazie uomo – fhbeltrami

0

Mentre DatagramSocket non è connesso, non associa alcuna porta sul computer locale in modo che l'IP sia 0.0.0.0. Prova a creare una connessione con socket.connect(SocketAddress addr) e otterrai il risultato giusto. Avrai lo stesso indirizzo IP 0.0.0.0 dopo il metodo socket.disconnect().

+0

Ma sto trasmettendo, quindi non ho nessun indirizzo da connettere. – fhbeltrami

+0

prova a connettersi a localhost (trova una porta libera lì) –

5

Ottenere l'indirizzo locale utilizzando meccanismi come questo in genere non funziona nel modo previsto. Un sistema ha in genere almeno due indirizzi - 127.0.0.1 e ip address of nic, quando si associa a un indirizzo per l'ascolto, si sono vincolanti a INADDR_ANY, che è lo stesso come l'indirizzo 0.0.0.0 che è lo stesso come vincolante per 127.0.0.1eip address of nic. Considera un laptop con una scheda di rete cablata e wireless: entrambi o entrambi potrebbero essere collegati contemporaneamente. Quale sarebbe l'indirizzo IP del sistema in questo caso?

Ho rubato un sottoinsieme della risposta per enumerating the ip addresses of all enabled NIC cards, che si occupa degli indirizzi di tutte le NIC, che elenca gli indirizzi IP per tutte le interfacce, sul mio sistema ho 10 interfacce, quindi mi ritrovo con un sacco di Indirizzi IP

try { 
    System.out.println("Full list of Network Interfaces:"); 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
     NetworkInterface intf = en.nextElement(); 
     System.out.println(" " + intf.getName() + " " + intf.getDisplayName()); 
     for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
      System.out.println("  " + enumIpAddr.nextElement().toString()); 
     } 
    } 
} catch (SocketException e) { 
    System.out.println(" (error retrieving network interface list)"); 
} 

In generale, però se sei la programmazione del server, quando si riceve un pacchetto su un servizio UDP, che contiene l'indirizzo IP del mittente, è sufficiente inviare la risposta al, e il computer è abbastanza intelligente per inviare fuori dalla corretta interfaccia di rete.

2

Javadoc per DatagramSocket.getLocalAddress() dice che questo

Returns - l'indirizzo locale al quale il socket è associato, null se il socket è chiuso, o un InetAddress che rappresenta l'indirizzo jolly se sia il socket non è vincolata, o il metodo di sicurezza manager checkConnect non consente l'operazione.

Se si crea un DatagramSocket utilizzando il costruttore no-args, si ottiene un socket che non è legato, e quindi (come da javadoc) getLocalAddress() dovrebbe restituire l'indirizzo IP jolly 0.0.0.0. E lo fa.

È sorprendente cosa si può imparare leggendo la documentazione :-)

2

Sto lavorando su un progetto simile - un progetto client uomo bellford. Ho provato la tua strada all'inizio e ho ottenuto anche 0.0.0.0. Poi l'ho capito usando solo un metodo di InetAddress per stampare l'indirizzo come una stringa - senza coinvolgere il socket del datagramma.

String localIP = InetAddress.getLocalHost().getHostAddress(); 
System.out.println(localIP); 

E ho visualizzato il mio IP interno: l'IP assegnato al router. Quale è stato abbastanza per me. Spero che questo ti aiuti.