尽管使用NetworkInterface
,InterfaceAddress
,InetAddress
的组合找到机器IP地址的线程很多,但我的情况超出了这个范围。在Windows平台上使用Java查找特定路由的传出IP地址
我需要确定在与特定(给定)目标通信期间将使用的传出IP地址。我必须假设主机上有多个具有多个IP地址的接口。这是我可以想象的现实生活场景中的最佳逼近,在这种场景中,我必须提供给远程机器,远程机器仅通过IP地址知道可用于访问我的主机的自己的IP。
到目前为止,我没有发现这个任务的纯Java解决方案。凭借我非常有限的Java知识,我看不出分析可能的路由选项的简单方法。这就是为什么在Linux上,我将只执行外部和解析这样的事情:
ip -o route get 10.10.xx.xx
而这又会给我想要的值(“SRC XX.XX.XX.XX”):
10.10.xx.xx dev eth1 src 10.20.xx.xx \ cache mtu 1500 advmss 1460 hoplimit 64
我的问题是如果有一种本地方式来实现相同的结果,而不需要调用上述的外部命令。如果不是,那么你对Windows的建议是什么?
我也用InetAddress.isReachable(...)
和外部ping
与给定的源地址尝试,但回落到TCP回声,当在我的环境前者失败的防火墙,而其他提供误报。 (在我的测试虚拟机上,我有一个接口直接绑定到主机网络,另一个接口通过VM主机作为网桥(NAT)。因此对于ping来说,两个路由根据需要都不支持相反的方向。
我将不胜感激任何建议,如何与继续...
虽然你不说出来明确,我得到你想找到不进行实际连接这些信息的印象。如果建立连接是可以接受的,[Socket.getLocalAddress()](http://docs.oracle.com/javase/8/docs/api/java/net/Socket.html#getLocalAddress--)就足够了。 – VGR
@VGR:你说得对 - 我想依赖路由数据而不是实际连接。让我们考虑一下配置应用程序,它将与使用连接的真实应用程序保持区别。而且只有远程主机才会启动所有的连接。从我这边来看,我可以做的很可能是ICMP请求,如ping。这就是我称之为“近似”的原因...... –