我正在尝试使用套接字编写程序,我需要获取自己的本地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,因为它是无连接的,但我认为你可以帮助我!
答案 0 :(得分:5)
使用此类机制获取本地地址通常不会按预期方式工作。系统通常至少有两个地址 - 127.0.0.1
和ip 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地址。