getLocalAddress()返回0.0.0.0

时间:2012-04-24 13:08:01

标签: 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);

你有什么想法吗?

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

5 个答案:

答案 0 :(得分:5)

使用此类机制获取本地地址通常不会按预期方式工作。系统通常至少有两个地址 - 127.0.0.1ip address of nic,当您绑定到一个地址进行侦听时,您绑定到INADDR_ANY,这与地址0.0.0.0相同,即地址127.0.0.1与绑定到ip address of nic 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)"); } 相同。考虑使用带有线和无线网卡的笔记本电脑 - 可以同时连接其中一个或两个。在这种情况下哪个被认为是系统的IP地址?

我偷了enumerating the ip addresses of all enabled NIC cards的答案子集,它处理了所有NIC的地址,列出了所有接口的IP地址,在我的系统上我有10个接口,所以我最终得到了很多IP地址。

{{1}}

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

答案 1 :(得分: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地址。

答案 2 :(得分:4)

我正在开展一个类似的项目 - 一个Bellford man客户项目。我一开始尝试了你的方式,也获得了0.0.0.0。然后我通过使用InetAddress方法将地址输出为字符串来计算出来 - 不涉及数据报套接字。

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

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

答案 3 :(得分:2)

DatagramSocket.getLocalAddress()的javadoc说明了这个

  

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

如果使用no-args构造函数创建checkConnect,则会得到一个未绑定的套接字,因此(根据javadoc)DatagramSocket应该返回通配符IP地址{{1 }}。确实如此。

通过阅读文档可以学到很多东西: - )

答案 4 :(得分:0)

虽然未连接DatagramSocket,但它不绑定本地计算机上的任何端口,因此它的IP为0.0.0.0。尝试与socket.connect(SocketAddress addr)建立联系,然后您将获得正确的结果。在socket.disconnect()方法之后,您将获得相同的0.0.0.0 ip地址。