2012-04-24 14 views
6

Próbuję napisać program za pomocą gniazd i muszę uzyskać mój lokalny adres IP.getLocalAddress() wracając 0.0.0.0

Kiedy używam getLocalAddress w gnieździe, otrzymuję tylko 0.0.0.0.

Oto mały kawałek mojego kodu:

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

Czy masz jakiś pomysł?

Używam UDP, więc nie jestem pewien, czy mogę uzyskać mój adres IP w ten sposób, ponieważ jest bezpołączeniowy, ale myślę, że możesz mi pomóc!

+0

Twoje gniazdo nie jest związane, to wyjaśnia 0 0 0 0 adres – GETah

+0

Próbowałem powiązać go do testu, ale mam komunikat: Już jest związany .. – fhbeltrami

Odpowiedz

4

Można spróbować:

InetAddress ip = InetAddress.getLocalHost();

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

DatagramSocket publicznych (int port InetAddress laddr) rzuca SocketException

tworzy gniazdo datagramu, zobowiązany do określonego adresu lokalnego. Port lokalny musi zawierać się między 0 a 65535 włącznie. Jeśli adres IP to 0.0.0.0, gniazdo zostanie powiązane z adresem wieloznacznym, adresem IP wybranym przez jądro.

+0

to nie działa ... Próbowałem też – fhbeltrami

+0

Teraz to działa. Dzięki, człowieku – fhbeltrami

0

Podczas gdy DatagramSocket nie jest podłączony, nie wiąże żadnego portu na komputerze lokalnym, więc jego IP to 0.0.0.0. Spróbuj połączyć się z socket.connect(SocketAddress addr), a otrzymasz właściwy wynik. Otrzymasz ten sam adres IP 0.0.0.0 po metodzie socket.disconnect().

+0

Ale nadaję, więc nie mam adresu do połączenia. – fhbeltrami

+0

spróbuj połączyć się z localhost (znajdź tam wolny port) –

5

Uzyskiwanie adresu lokalnego za pomocą mechanizmów takich jak ten zazwyczaj nie działa w sposób, jakiego oczekujesz. System ma na ogół co najmniej dwa adresy - 127.0.0.1 i ip address of nic, gdy wiążą się z adresem do słuchania, to wiążą się INADDR_ANY, który jest taki sam jak adres 0.0.0.0 która jest taka sama jak wiązanie 127.0.0.1iip address of nic. Zastanów się, czy laptop z przewodową i bezprzewodową kartą sieciową - jedno lub oba mogą być połączone w tym samym czasie. Który w tym przypadku byłby uważany za adres IP systemu?

Ukradłem podzbiór odpowiedzi na enumerating the ip addresses of all enabled NIC cards, który zajmuje się adresami wszystkich kart sieciowych, które wymienia adresy IP dla wszystkich interfejsów, w moim systemie mam 10 interfejsów, więc kończę z wieloma Adresy 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)"); 
} 

Generalnie jednak, jeśli jesteś programowania serwera, gdy otrzyma pakiet na usługi UDP, zawiera adres IP nadawcy, który po prostu wysłać odpowiedź, a komputer jest wystarczająco inteligentny, aby wysłać to z prawidłowego interfejsu sieciowego.

2

Javadoc dla DatagramSocket.getLocalAddress() mówi to

zwroty - lokalny adres, na którym gniazdo jest związana, null jeśli gniazdo jest zamknięte, albo InetAddress reprezentujący wieloznaczny adres czy też gniazdo nie jest związana, lub metoda menedżera bezpieczeństwa checkConnect nie zezwala na operację.

Jeśli utworzysz DatagramSocket pomocą no-args konstruktora, masz gniazdo, które nie jest związane, a więc (zgodnie z javadoc) getLocalAddress() powinien zwrócić adres IP wieloznaczny 0.0.0.0. I tak.

dziwi to, co można dowiedzieć się czytając dokumentację :-)

2

pracuję nad podobnym projektem - w bellford projektu klienta człowiekiem. Na początku spróbowałem twojej drogi i dostałem również 0.0.0.0. Potem zorientowałem się, po prostu za pomocą metody InetAddress, aby wyprowadzić adres jako ciąg - bez angażowania gniazda datagramowego.

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

Wyświetlałem mój wewnętrzny adres IP - adres IP przypisał mi router. To mi wystarczyło. Mam nadzieję że to pomoże.