getLocalAddress()返回0.0.0.0

fhb*_*ami 6 java sockets udp

我正在尝试使用套接字编写程序,我需要获取自己的本地IP地址.

当我在套接字中使用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);
Run Code Online (Sandbox Code Playgroud)

你有什么主意吗?

我正在使用UDP,所以我不确定我是否可以通过这种方式获取IP,因为它是无连接的,但我认为你可以帮助我!

Pet*_*esh 5

使用这样的机制获取本地地址通常不会以您期望的方式工作.系统通常至少有两个地址- 127.0.0.1并且ip address of nic,当你绑定到一个地址,侦听,您绑定到INADDR_ANY,这是一样的地址0.0.0.0是一样的结合127.0.0.1 ip address of nic.考虑使用带有线和无线网卡的笔记本电脑 - 可以同时连接其中一个或两个.在这种情况下哪个被认为是系统的IP地址?

我偷了一个答案的子集来枚举所有启用的NIC卡的IP地址,它处理所有NIC的地址,列出所有接口的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)");
}
Run Code Online (Sandbox Code Playgroud)

通常,虽然如果您是服务器编程,当您在UDP服务上收到数据包时,它包含发送者的IP地址,您只需将响应发送到该地址,并且计算机足够智能,可以将其发送出正确的网络接口.


小智 5

我正在从事类似的项目-贝尔福德男士客户项目。一开始我尝试了您的方法,也得到了0.0.0.0。然后,我仅使用InetAddress的方法将地址输出为字符串即可解决问题,而无需使用数据报套接字。

String localIP = InetAddress.getLocalHost().getHostAddress();
System.out.println(localIP);
Run Code Online (Sandbox Code Playgroud)

然后,我显示了我的内部IP-该IP为我的路由器分配了。这对我来说足够了。希望这可以帮助。


Nik*_*har 4

你可以试试 :

InetAddress ip = InetAddress.getLocalHost();

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

public DatagramSocket(int port, InetAddress laddr) 抛出 SocketException

创建一个数据报套接字,绑定到指定的本地地址。本地端口必须介于 0 到 65535 之间(含边界值)。如果IP地址是0.0.0.0,套接字将绑定到通配符地址,即内核选择的IP地址。