Java,DatagramPacket接收,如何判断本地ip接口
Posted
技术标签:
【中文标题】Java,DatagramPacket接收,如何判断本地ip接口【英文标题】:Java, DatagramPacket receive, how to determine local ip interface 【发布时间】:2014-02-26 14:59:33 【问题描述】:以下是绑定到所有 ip 接口和特定 udp 端口的简单案例:
int bindPort = 5555; // example, udp port number
DatagramSocket socket = new DatagramSocket(bindPort);
byte[] receiveData = new byte[1500];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
...
socket.receive(receivePacket);
我如何知道我在哪个 ip 接口上收到了数据包?
我可以看到有getSocketAddress():
获取SocketAddress(通常是IP地址+端口号) 此数据包正在发送到或来自的远程主机。
但返回远程 ip+port。我想知道本地ip(本例中本地端口为5555)。
std. 有可能吗? Java 库?
【问题讨论】:
我不明白,你已经知道了,因为你正在通过它。本地 IP 地址为 127.0.0.1。 本地IP地址不是总是127.0.0.1吗? 您对端口的看法是正确的,这很明显。但是本地地址可以是任何地址,因为我绑定到 0.0.0.0。明白了吗?InetAddress IP=InetAddress.getLocalHost();
System.out.println("IP of my system is := "+IP.getHostAddress());
盗自***.com/a/9481944/3224483
【参考方案1】:
我知道这个问题。为了澄清这个目的:您通过 UDP 收到一个数据包(通常是某种发现实现)并希望返回一个类似的答案(“亲爱的客户,请从 http://<wtf-is-my-ip>:8080/thefile.txt
下载文件”)。我的机器有三个 IP:127.0.0.1、192.168.x.x 和 10.x.x.x,目标是找出远程客户端将 UDP 数据包发送到 192.168.x.x 并且这必须是也适用于另一个连接的 IP .
从weupnp project 我发现了以下代码,虽然不完美但对我有用:
private InetAddress getOutboundAddress(SocketAddress remoteAddress) throws SocketException
DatagramSocket sock = new DatagramSocket();
// connect is needed to bind the socket and retrieve the local address
// later (it would return 0.0.0.0 otherwise)
sock.connect(remoteAddress);
final InetAddress localAddress = sock.getLocalAddress();
sock.disconnect();
sock.close();
sock = null;
return localAddress;
//DatagramPacket receivePacket;
socket.receive(receivePacket);
System.out.print("Local IP of this packet was: " + getOutboundAddress(receivePacket.getSocketAddress()).getHostAddress);
如果您在同一网络中有多个 IP,或者由于某些高级路由配置,代码可能会返回错误的 IP。但到目前为止,这是我能找到的最好的,并且对于大多数情况来说已经足够了。
【讨论】:
【参考方案2】:您可以结合使用NetworkInterface
和InetAddress
类来获取网络的详细信息。
NetworkInterface
InetAddress
【讨论】:
如果我使用 tcp 和 ServerSocket 类,则有 getLocalSocketAddress() 会返回我需要的内容。但是使用 udp,我找不到类似的东西。以上是关于Java,DatagramPacket接收,如何判断本地ip接口的主要内容,如果未能解决你的问题,请参考以下文章