gpt4 book ai didi

java - address.isReachable 不会发现网络上的所有节点

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:16 25 4
gpt4 key购买 nike

我已将代码精简为最基本的内容,它非常简单明了。

我有以下代码:

public ArrayList<Node> getNodes() throws IOException
{
ArrayList<Node> nodes = new ArrayList<Node>();

StringBuffer root = new StringBuffer(InetAddress.getLocalHost().getHostAddress());
while(!root.toString().endsWith("."))
root.deleteCharAt(root.length() - 1);
//^^ this code gets the ip, for ex 127.0.0.1, and trims the last number, to make it
//^^ 127.0.0. <-- see the trailing 0

for(int host = 0;host < 256; host++)
{
InetAddress address = InetAddress.getByName(root.toString() + host);
try
{
if(address.isReachable(500)) // pings the address
nodes.add(new Node(address.getHostAddress(), false));
}catch(Exception e){new Node(address.getHostAddress(), true);}
}

return nodes;
}

这是节点类,非常简单:

public class Node 
{
public Node(String address, boolean restricted)
{
this.address = address;
this.restricted = restricted;
}

public String address;
public boolean restricted;
}

这是我的主要代码,它执行 getNodes():

case 1:
System.out.println("Searching for nodes...");
NodeDetector node = new NodeDetector(); // this is the class
//where getNodes resides
ArrayList<Node> nodes = node.getNodes();

Iterator<Node> it = nodes.iterator();
while(it.hasNext())
{
System.out.println("Node: "+it.next().address);
}

System.out.println("stopped searching for nodes...");
break;
<小时/>

这是我的输出:

Searching for nodes...
Node: 00.00.17.99
Node: 00.00.17.100
Node: 00.00.17.149
Node: 00.00.17.150 <-- this is my computer
Node: 00.00.17.154
Node: 00.00.17.156
Node: 00.00.17.254
stopped searching for nodes...
<小时/>

现在问题来了

我在手机上下载了一个网络节点发现工具,它可以找到至少 5 个以上的节点。我尝试更改超时值,但仍然没有成功。当我对手机上的网络工具(而不是计算机上的)找到的地址执行 ping 操作时,会立即收到并返回 ping。这个问题是类似的,它对我有一点帮助,但我仍然陷入困境:

我正在 Mac 上运行我的工具,它似乎可以很好地连接其他 Mac、iPod 和路由器,但仅此而已。为什么我的程序无法检测到网络上的其他设备?

<小时/>

这是我从手机上的网络工具获得的输出:

00.00.17.99 <-- SMC Networks *
00.00.17.100 <-- XEROX *
00.00.17.133 <-- My Phone (Android)
00.00.17.134 <-- Intel
00.00.17.142 <-- Apple
00.00.17.149 <-- Apple *
00.00.17.150 <-- Apple * <-- this is my computer
00.00.17.154 <-- Apple *
00.00.17.155 <-- Intel
00.00.17.156 <-- Apple *
00.00.17.158 <-- Motorola Mobility
00.00.17.254 <-- Netopia *
<小时/>

我在手机上的工具与我在计算机上编写的工具一致的地方打了一个*。我已经运行了几次这个测试,每次在我的计算机和手机上都得到相同的输出,在测试期间没有添加或从网络中删除任何设备。

最佳答案

经过几天的研究,我发现这是一个不错的解决方案:

try
{
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 -W 250 " + address.getHostAddress());
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);


if(reachable)
nodes.add(new Node(address.getHostAddress(), false));
}catch(Exception e)
{
new Node(address.getHostAddress(), true);
}

唯一的缺点是它依赖于系统。我将是唯一使用这个工具的人,所以这对我来说真的不是问题。

关于java - address.isReachable 不会发现网络上的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11355085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com