我正在尝试使用套接字编写程序,我需要获取自己的本地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.1
和ip 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)发送出去。