InetAddress.isReachable()在我的Galaxy S9 +上始终返回false

时间:2020-06-14 16:36:36

标签: java android ping

我正在尝试开发仅供个人使用的Android应用。目的是使用我的移动设备发现连接到我的家庭网络的所有设备,并获得任何额外的延迟。我正在使用InetAddress.isReachable(),它总是返回false。

还有其他帖子以一种或另一种形式问同样的问题。但是,答案已有多年历史,并提出了对我不起作用的解决方法。希望现在的情况比几年前好。一个常见的答案是避免使用InetAddress.isReachable(),而是连接到常用端口。就我而言,这些设备是简单的家用设备,例如电视,机顶盒,蓝光播放器,笔记本电脑,平板电脑,台式机,电话等。只能在端口上侦听的设备是NAS,路由器和打印机。我的其他设备均未运行任何“服务器”。尝试在特定的端口(例如80、443、22、21等)上连接对我不起作用。

上下文:

  1. 我的手机可以连接到目标设备。我可以连接到我的 我的手机中的NAS和打印机。
  2. 目标设备已连接,正在运行,并且愿意/能够响应ICMP。我可以在PC上使用ping成功地ping通所有设备(包括手机),而无需提升特权。
  3. 目标设备响应InetAddress.isReachable()。一个独立的Java 使用InetAddress.isReachable()在笔记本电脑上运行的程序成功。

有人知道如何使InetAddress.isReachable()在Android应用中正常工作吗?

谢谢!

以下是台式机独立Java程序的代码段和控制台输出:

    public static double sendPingRequest(String ipAddress) throws UnknownHostException, IOException 
    { 
        int timeout = 600;
            long startTime = 0;
            long endTime = 0;
            double duration = -99;


            InetAddress targetHost = InetAddress.getByName(ipAddress); 

            startTime = System.currentTimeMillis();
            if (targetHost.isReachable(timeout)) { 
                endTime = System.currentTimeMillis();
                duration = (double)(endTime-startTime); 

            } else {
                duration = -1;
            }

            if (duration > -1 ) {
                System.out.println();
                System.out.print("Ping " + ipAddress + ": " + duration + " ms");
            } else {
                System.out.print(".");
            }

            return duration;
        }

        C:\Temp>java PingMonitor
        Ping Monitor

        Ping 192.168.1.1: 1.0 ms
        Ping 192.168.1.2: 1.0 ms
        Ping 192.168.1.4: 1.0 ms
        Ping 192.168.1.111: 1.0 ms
        Ping 192.168.1.112: 1.0 ms
        Ping 192.168.1.113: 2.0 ms
        Ping 192.168.1.115: 7.0 ms
        Ping 192.168.1.141: 1.0 ms
        Ping 192.168.1.142: 5.0 ms
        Ping 192.168.1.143: 2.0 ms
        Ping 192.168.1.144: 9.0 ms
        Ping 192.168.1.145: 14.0 ms
        Ping 192.168.1.146: 7.0 ms
        Ping 192.168.1.214: 2.0 ms
        Ping 192.168.1.215: 10.0 ms
        Ping 192.168.1.216: 2.0 ms
        Ping 192.168.1.217: 2.0 ms
        Ping 192.168.1.221: 2.0 ms
        Ping 192.168.1.223: 2.0 ms
        C:\Temp>

下面是android代码。如您所见,它几乎与独立的Java程序相同。当我在Galaxy S9 +上运行该设备时,这对于我网络上的所有设备始终会返回无法访问的状态。

private double sendPingRequest(String ipAddress) throws UnknownHostException, IOException {
    int timeout = 1000;
    long startTime = 0;
    long endTime = 0;
    double duration = -2;
    InetAddress target;

    target = InetAddress.getByName(ipAddress);

    startTime = System.currentTimeMillis();
    if (target.isReachable(timeout)) {
        endTime = System.currentTimeMillis();
        duration = (double) (endTime - startTime);
    } else {
        duration = -1;
    }

    return duration;
}

0 个答案:

没有答案
相关问题