我正在尝试使用套接字编写程序,我需要获取自己的本地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);
Run Code Online (Sandbox Code Playgroud)
你有什么主意吗?
我正在使用UDP,所以我不确定我是否可以通过这种方式获取IP,因为它是无连接的,但我认为你可以帮助我!
使用这样的机制获取本地地址通常不会以您期望的方式工作.系统通常至少有两个地址- 127.0.0.1并且ip address of nic,当你绑定到一个地址,侦听,您绑定到INADDR_ANY,这是一样的地址0.0.0.0是一样的结合127.0.0.1 和 ip address of nic.考虑使用带有线和无线网卡的笔记本电脑 - 可以同时连接其中一个或两个.在这种情况下哪个被认为是系统的IP地址?
我偷了一个答案的子集来枚举所有启用的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)");
}
Run Code Online (Sandbox Code Playgroud)
通常,虽然如果您是服务器编程,当您在UDP服务上收到数据包时,它包含发送者的IP地址,您只需将响应发送到该地址,并且计算机足够智能,可以将其发送出正确的网络接口.
小智 5
我正在从事类似的项目-贝尔福德男士客户项目。一开始我尝试了您的方法,也得到了0.0.0.0。然后,我仅使用InetAddress的方法将地址输出为字符串即可解决问题,而无需使用数据报套接字。
String localIP = InetAddress.getLocalHost().getHostAddress();
System.out.println(localIP);
Run Code Online (Sandbox Code Playgroud)
然后,我显示了我的内部IP-该IP为我的路由器分配了。这对我来说足够了。希望这可以帮助。
你可以试试 :
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地址。
| 归档时间: |
|
| 查看次数: |
14253 次 |
| 最近记录: |