这是绑定到所有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 +端口。我想知道本地ip(在这个例子中本地端口是5555)。
是否可以使用std。 Java库?
答案 0 :(得分:1)
我知道这个问题。为了澄清这个目的:你通过UDP接收一个数据包(通常是某种发现实现),并希望返回一个像(&#34;亲爱的客户端,请从http://<wtf-is-my-ip>:8080/thefile.txt
&#34;)下载文件。我的机器有三个IP:127.0.0.1,192.168.xx和10.xxx,目的是找出远程客户端将UDP数据包发送到192.168.xx并且这必须是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。但到目前为止,它是我能找到的最好的,而且在大多数情况下都足够了。
答案 1 :(得分:0)