2012-04-24 5 views
6

Я пытаюсь написать программу, используя Sockets, и мне нужно получить свой локальный IP-адрес.getLocalAddress() return 0.0.0.0

Когда я использую getLocalAddress в сокете, я получаю 0.0.0.0.

Вот маленький кусочек моего кода:

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

Есть ли у вас какие-либо идеи?

Я использую UDP, поэтому я не уверен, могу ли я получить свой IP-адрес, потому что он без установления соединения, но я думаю, что вы можете мне помочь!

+0

Ваш сокет не связан, что объясняет адрес 0 0 0 0 – GETah

+0

Я попытался связать его для теста, но я получил сообщение: он уже связан .. – fhbeltrami

ответ

4

Вы можете попробовать:

InetAddress ф = InetAddress.getLocalHost();

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

общественного DatagramSocket (интермедиат порт, InetAddress LADDR) бросает SocketException

Создает датаграмм сокет, связанный с указанным локальным адресом. Локальный порт должен быть от 0 до 65535 включительно. Если IP-адрес равен 0.0.0.0, сокет будет привязан к подстановочному адресу, IP-адресу, выбранному ядром.

+0

он не работает ... я тоже пытался – fhbeltrami

+0

оно работает. Спасибо человек – fhbeltrami

0

Хотя DatagramSocket не подключен, он не связывает ни один порт на локальном компьютере, поэтому его IP-адрес составляет 0.0.0.0. Попробуйте установить соединение с socket.connect(SocketAddress addr), и тогда вы получите правильный результат. Вы получите тот же адрес 0.0.0.0 ip после метода socket.disconnect().

+0

Но я транслирую, поэтому у меня нет адреса для подключения. – fhbeltrami

+0

попробуйте подключиться к localhost (найдите там свободный порт) –

5

Получение локального адреса с использованием таких механизмов обычно не работает так, как вы ожидаете. Система обычно имеет по крайней мере два адреса - 127.0.0.1 и ip address of nic, когда вы связываете к адресу для прослушивания, вы являетесь обязательными для INADDR_ANY, который является таким же, как адрес 0.0.0.0, который является таким же, как связывание с 127.0.0.1иip address of nic. Рассмотрим ноутбук с проводной и беспроводной сетевой картой - либо один, либо оба из них могут быть подключены одновременно. Что в этом случае будет считаться IP-адресом системы?

Я украл подмножество ответа для enumerating the ip addresses of all enabled NIC cards, в котором рассматриваются адреса всех сетевых адаптеров, в которых перечислены IP-адреса для всех интерфейсов. В моей системе у меня 10 интерфейсов, поэтому я получаю много 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)"); 
} 

Вообще, хотя, если вы программирования сервера, когда вы получаете пакет на UDP службы, он содержит IP-адрес отправителя, который вы просто отправить ответ, а компьютер достаточно умен, чтобы отправить это из правильного сетевого интерфейса.

2

документация Javadoc для DatagramSocket.getLocalAddress() говорит этот

Возвращает - локальный адрес, к которому сокет связан, null если сокет закрыт, или InetAddress представляющий подстановочные адрес, если либо сокет не связан, или менеджер безопасности checkConnect метод не разрешает операцию.

При создании DatagramSocket с использованием не-арг конструктора, вы получаете сокет, который не связан, и поэтому (согласно Javadoc) getLocalAddress() должен возвращать подстановочный IP-адрес 0.0.0.0. И это так.

Это удивительно, что вы можете узнать, прочитав документацию :-)

2

Я работаю над аналогичным проектом - в bellford проекта мужчина клиента. Сначала я попробовал свой путь и получил 0.0.0.0. Затем я понял это, просто используя метод InetAddress для вывода адреса в виде строки - без использования сокета datagram.

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

И я отобразил свой внутренний IP - IP-адрес, назначенный моим маршрутизатором. Этого было достаточно для меня. Надеюсь это поможет.

Смежные вопросы