我正在尝试使用套接字编写程序,我需要获取自己的本地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);

你有什么主意吗?

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

最佳答案

使用这种机制获取本地地址通常无法按您期望的方式工作。一个系统通常至少有两个地址-127.0.0.1ip address of nic,当您绑定(bind)到一个要监听的地址时,您将绑定(bind)到INADDR_ANY,这与地址0.0.0.0相同,这与绑定(bind)到127.0.0.1 ip address of nic相同。考虑一台带有有线和无线网卡的笔记本电脑-可以同时连接两个或两个。在这种情况下,哪个将被视为系统的IP地址?

我偷了enumerating the ip addresses of all enabled NIC cards答案的一个子集,ojit_a处理所有NIC的地址,列出了所有接口(interface)的IP地址,在我的系统上,我有10个接口(interface),因此我得到了很多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地址(您只需将响应发送到该IP地址),并且计算机足够聪明,可以将其从正确的网络接口(interface)发送出去。

08-26 19:46
查看更多