在安卓系统中实现Traceroute功能

5

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

我想要实现像安卓应用商店中可用的这些应用程序那样的traceroute功能。

Visual TracertPro

Traceroute

我知道在Windows命令提示符中键入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
好的首篇文章!当用户的第一篇文章具有这种质量时,我总是感到很高兴。 - amccormack
2个回答

4

busybox实用程序包含traceroute功能。您可以按照YouTube教程上的步骤,在未root手机的情况下在设备上运行busybox。然后,您应该能够使用您发布的第一个代码段从您的应用程序中查询traceroute。当然,在调用traceroute时,您需要确保使用正确的路径。


我刚刚看了那个视频,他的设备连接到电脑上并且使用命令,但是如果我想制作一个应用程序,并且希望用户不需要像那样做任何事情,我该如何实现呢?如果您知道,能否提供一些代码,以便我可以理解它。 - Music Blues
@MusicBlues 你可以将busybox作为应用程序的资产包含在内,然后代表用户安装它。评论不是解释这个的最佳位置,所以你应该尝试提出一个额外的问题。 - amccormack
请查看我的新问题链接,如果您有可能帮忙,请提供帮助。http://stackoverflow.com/questions/15827492/how-to-add-busybox-and-implement-traceroute-functionality-in-android - Music Blues

1
Traceroute通过向一个不太可能的端口发送3个ICMP消息,启动计时器并将数据报中的TTL设置为1(最多1跳)来工作。当它到达第一个路由器时,数据报会过期,路由器将拒绝进一步发送数据包,并响应一个过期消息(ICMP类型11代码0),其中包括路由器名称、IP地址、MTU和一些其他数据。源将从计时器获取往返时间。一旦traceroute获得了第一跳的数据,它将重复这些步骤,但将TTL增加一,并一直重复这些步骤,直到最终到达主机本身。
为了使您的代码起作用,您需要能够操作网络层数据报并在标头中设置TTL值。之后,只需要解析返回TTL过期消息的每个路由器的响应即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接