5

这是我第一次问任何问题,请原谅我的任何错误。

我想实现像 android play store 中可用的这个应用程序这样的 traceroute 功能。

视觉示踪专业版

跟踪路由

我知道在 Windows 中输入 CMD 时traceroute google.com会显示所有使用的中间 IP。

现在我已经尝试过了。

我尝试使用traceroute命令,但 android 不支持traceroute只有 root 设备支持它。

Process process =Runtime.getRuntime().exec("traceroute yahoo.com");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int i;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((i = reader.read(buffer)) > 0)
    output.append(buffer, 0, i);
reader.close();
Log.d("*************", ""+output);

所以我想使用 ping 命令来实现,但没有成功。通过使用 ping 命令,它只提供 google.com 的 ip,而不是我需要的和上面的应用程序显示。

Process process = Runtime.getRuntime().exec("/system/bin/ping -t 1 -c 1 google.com");

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int i;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((i = reader.read(buffer)) > 0)
    output.append(buffer, 0, i);
reader.close();
Log.d("*************", ""+output);

请指导我如何实现这一目标。一些链接或一些教程将非常有用。

提前谢谢你。

4

2 回答 2

4

busybox实用程序包括 traceroute 。您可以按照这个youtube 教程在您的设备上运行busybox,而无需为您的手机生根。然后,您应该能够使用您发布的第一个代码段从您的应用程序中查询 traceroute。当然,您需要确保在调用 traceroute 时使用正确的路径。

于 2013-04-04T07:05:50.597 回答
1

Traceroute 的工作原理是通过 UDP 向一个不太可能的端口号发送 3 条 ICMP 消息,每次启动一个计时器,并将数据报中的 TTL 设置为 1(最大 1 跳)。当它到达第一个路由器时,数据报过期,路由器将拒绝进一步发送数据包,并以过期消息(ICMP 类型 11 代码 0)进行响应,其中包括路由器名称、IP 地址、MTU 和一些其他位数据的。源将从定时器获取往返时间。一旦 traceroute 从第一跳获取数据,它将重复这些步骤,但将 TTL 加一,并不断重复这些步骤,直到最终到达主机本身。

为了让您的代码正常工作,您需要能够操作网络层数据报并在标头中设置 TTL 值。之后,只需解析来自每个返回 TTL 过期消息的路由器的响应即可。

于 2013-11-08T00:35:54.067 回答