如何在Java中确定路由器/网关的IP?

2022-09-02 22:56:37

如何在Java中确定路由器/网关的IP?我可以很容易地获得我的IP。我可以使用网站上的服务获取我的互联网IP。但是,如何确定网关的 IP?

这在 .NET 中有些容易,如果您知道自己的方式。但是,如何在Java中做到这一点呢?


答案 1

在Windows,OSX,Linux等上,Chris Bunch的答案可以通过使用

netstat -rn

代替命令。traceroute

网关的 IP 地址将显示在开始或 的行的第二个字段中。default0.0.0.0

这解决了尝试使用的许多问题:traceroute

  1. 在 Windows 上实际上是 ,因此在代码中不需要 O/S 依赖项traceroutetracert.exe
  2. 这是一个快速运行的命令 - 它从O / S获取信息,而不是从网络获取信息
  3. traceroute有时被网络阻止

唯一的缺点是,在找到正确的行之前,有必要从输出中读取行,因为将有多行输出。netstat

编辑:如果您使用的是 MAC(在 Lion 上测试),则默认网关的 IP 地址位于以“默认”开头的行的第二个字段中,或者位于以“0.0.0.0”开头的行的第三个字段中(在 Windows 7 上测试)

窗户:

网络目标网络掩码网关接口跃点计数

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

苹果电脑:

目标网关标志 引用 使用 Netif 过期

默认值 192.168.2.254 UGSc 104 4 en1


答案 2

不幸的是,Java并没有像其他语言那样令人愉快。以下是我所做的:

import java.io.*;
import java.util.*;

public class ExecTest {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("traceroute -m 1 www.amazon.com");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        String thisLine = output.readLine();
        StringTokenizer st = new StringTokenizer(thisLine);
        st.nextToken();
        String gateway = st.nextToken();
        System.out.printf("The gateway is %s\n", gateway);
    }
}

这假定网关是第二个令牌,而不是第三个令牌。如果是这样,您需要添加额外的内容以将分词器再前进一个点。st.nextToken();


推荐