6

我正在尝试使用 Sockets 编写程序,我需要获取自己的本地 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,因为它是无连接的,但我认为你可以帮助我!

4

5 回答 5

6

使用这样的机制获取本地地址通常不会以您期望的方式工作。一个系统通常至少有两个地址 - 127.0.0.1and ip address of nic,当你绑定到一个地址进行监听时,你绑定到的是 INADDR_ANY,这与绑定到and0.0.0.0的地址相同。考虑一台带有有线和无线网卡的笔记本电脑——它们中的一个或两个可以同时连接。在这种情况下,哪个会被视为系统的 IP 地址?127.0.0.1 ip address of nic

我窃取了枚举所有已启用 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)");
}

一般来说,如果你是服务器编程,当你在 UDP 服务上接收到一个数据包时,它包含发送者的 IP 地址,你只需将响应发送到该地址,并且计算机足够聪明,可以将它从正确的网络接口发送出去.

于 2012-04-24T13:57:06.463 回答
5

我正在做一个类似的项目——一个贝尔福德人客户项目。我一开始尝试了你的方式,也得到了 0.0.0.0。然后我通过使用 InetAddress 的方法将地址输出为字符串来解决这个问题 - 不涉及数据报套接字。

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

我显示了我的内部 IP - 分配给我的路由器的 IP。这对我来说已经足够了。希望这可以帮助。

于 2014-12-10T21:40:45.657 回答
4

你可以试试 :

InetAddress ip = InetAddress.getLocalHost();

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

公共 DatagramSocket(int 端口,InetAddress laddr)抛出 SocketException

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

于 2012-04-24T13:12:55.863 回答
2

javadoc forDatagramSocket.getLocalAddress()说这个

返回 - 套接字绑定到的本地地址(null如果套接字已关闭),或者InetAddress表示通配符地址(如果套接字未绑定或安全管理器checkConnect方法不允许该操作)。

如果您DatagramSocket使用无参数构造函数创建一个,您将获得一个未绑定的套接字,因此(根据 javadoc)getLocalAddress()应该返回通配符 IP 地址0.0.0.0。它确实如此。

通过阅读文档可以学到的东西令人惊讶:-)

于 2012-04-24T15:17:19.650 回答
0

虽然 DatagramSocket 没有连接,但它没有绑定本地机器上的任何端口,所以它的 IP 是 0.0.0.0 。尝试与之建立联系socket.connect(SocketAddress addr),然后您将获得正确的结果。方法后您将获得相同的 0.0.0.0 ip 地址socket.disconnect()

于 2012-04-24T13:19:05.080 回答