检查 java 中网络中所有节点的可访问性

check accessibility of all nodes in a network in java

我想使用 java 检查网络中所有节点的可访问性。我已阅读 This and This 个问题,并通过帮助这些问题编写了我的方法,我的网络中至少有两个可访问的测试 Ips,其中一个是 192.168.1.1,另一个是 192.168.1.102 你可以在下图中看到 192.168.1.1 的测试:

Odk 但是当我 运行 我的代码时,我的应用程序说 192.168.1.1 不可访问。这是图片,我用红色箭头指向它:

好的,这是我的 java 代码:

private void checkNetworkAccessibility(){
        int timeout = 1000;
        String subnet = firstSubnet.getText() + "." + secondSubnet.getText() + "." + thirdSubnet.getText() + ".";
        DefaultTableModel model = (DefaultTableModel)networkTable.getModel();
        for(int i=1;i<=254;i++){            
            try {                
                if(InetAddress.getByName(subnet+i).isReachable(timeout)){
                    model.addRow(new Object[]{subnet + i, subnet + i, "بله", "بله"});
                }
                else{
                    model.addRow(new Object[]{subnet + i, "نامشخص", "خیر", "بله"});
                }
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }

        }
    }

我的代码有什么问题?

问题是 .isReachable() 不可靠。它的实现完全 OS 依赖!

我们以Linux为例;此方法使用 echo TCP 服务(端口 7)。你真的知道今天有甚至 运行ning 的服务器吗?我没有。

无法ping通;看看这个:

$ ls -l $(which ping)
-rwsr-xr-x 1 root root 44168 May  7  2014 /bin/ping

是的,没错;粘性位。这样做的原因是 ping 命令沿着线路发送一个 ICMP 回显请求数据包,这需要您能够访问原始套接字。

除非您拥有必要的权限,否则您无法做到,而在 Java 中您也无法做到!除非您使用本机库。而您 运行 拥有必要的权限。这通常意味着您需要成为管理员。你不想要的。

当然,系统管理员甚至可能决定阻止主机上的传入回显请求数据包,因此即使 ping 也不可靠...