【问题标题】:Resolve network interface for a given IP address in Java在 Java 中解析给定 IP 地址的网络接口
【发布时间】:2016-01-13 16:02:41
【问题描述】:

我想提前知道给定 IP 地址X 将使用什么网络接口。

我可以通过浏览java.net.NetworkInterface.getNetworkInterfaces() 的结果并检查XgetInterfaceAddresses() 返回的每个InterfaceAddress 的IP 地址和子网掩码来做到这一点,但这似乎并不有趣,而且如果有多个选择有效,我最终可能会得到与 IP 堆栈选择的结果不同的结果。

我为什么需要它?

我需要知道可用于从具有 IP 地址X 的对等方联系我的 IP 地址。

【问题讨论】:

  • 出于什么目的?注意您描述的技术不是确定的。 TCP 是通过静态路由表完成的,而不是你描述的那样。
  • @EJP 我编辑了我的帖子以添加关于我的目的的解释(我希望它不会太笨拙)。
  • @EJP 如果机器上没有定义静态路由,我猜我描述的技术是正确的,不是吗?
  • 你还没有真正回答我的问题。 为什么您需要知道可用于从其他对等方联系您的 IP 地址?需要知道这一点的是同伴,而不是你。当他连接时,您可以从套接字中获取它。总是至少有一个静态路由,
  • @EJP 我需要知道它,因为另一个同行正在要求它。我同意他可以从套接字中检索它,但我无法控制此代码。

标签: java routing network-programming


【解决方案1】:

有一个答案here 我觉得可以解决你的问题。

但为了进一步扩展,下面的代码会打印出接口的 IP 地址,您可以使用该接口将 IP 数据包从主机路由到 IP x.x.x.x

DatagramSocket s = new DatagramSocket();
s.connect(InetAddress.getByAddress(new byte[]{x,x,x,x}), 0);
NetworkInterface n = NetworkInterface.getByInetAddress(s.getLocalAddress());
InetAddress yourInterfaceIP = n.getInetAddresses().nextElement();
System.out.println(yourInterfaceIP.getHostAddress());

设置 UDP 数据报套接字不会发送任何内容。它只是简单地检查两个端点之间的权限和路由。您指定的 IP 也不需要可访问才能正常工作。

这将使用您运行它的主机上存在的路由。显然它不使用远程主机上的路由。真的,它从X 的角度返回它认为可达的接口。

这显然不适用于代理,您需要使用 whats-my-ip 类型的服务来查找您的代理地址。

【讨论】:

    猜你喜欢
    • 2020-01-14
    • 2011-11-09
    • 1970-01-01
    • 2011-01-17
    • 2011-04-24
    • 2021-01-03
    • 1970-01-01
    • 2013-06-28
    • 2014-02-26
    相关资源
    最近更新 更多