即使端口未打开(端口扫描),套接字连接也始终返回true

时间:2016-01-06 02:03:24

标签: android sockets ssh ip port

问题:

我有 FOR Statement ,它使用不同的IP地址调用方法(范围从10.0.0.1到10.0.0.255,因为我没有IP扫描程序)。此方法是Future Callable并返回布尔值true或false。 Method的功能是基本上做一个 Socket ,用给定的IP& amp;连接到这个Socket。端口+超时,并根据给定的IP地址返回true或false,端口是否打开。

我的计划: 我正在尝试检查连接到同一WIFI网络的设备是否有开放端口(SSH端口),这样我就可以在不知道它的IP地址的情况下通过SSH连接到该设备。我的想法是获取Android设备的私有IP地址,检查它是否等于公共专用IP地址(例如10.0.0。*)并扫描它的IP范围(从10.0.0.1-255)打开SSH端口(22)。

TODO:

  1. 从Android设备获取IP(已检查
  2. 过滤它,如果它的私有IP以“10”开头。 &安培;&安培; “10.0.0”。或“192”。 &安培;&安培; “192.168”。等等(已检查
  3. 检查端口22是否在范围“10.0.0.1-255”或“192.168.1.1-255”上打开。 (当前
  4. 我在这里使用了端口扫描程序的代码:Socket Port Scanner在这个问题中,如果固定IP地址上的端口是打开的,则Future方法返回true或false。然后将此方法的结果添加到Future Boolean List Array中。然后查询,用户可以看到在这个固定的IP地址上打开了多少个端口。

    我对它进行了修改,因此方法正在扫描固定端口的多个IP地址,然后添加IP地址,SSH端口是打开的,未来的布尔列表数组。除了socket.connect(new InetSocketAddress(ip, port), timeout);总是返回true之外,这个工作正常。我试着查看它为什么会这样做的代码,但我找不到答案。如果你有任何想法我怎么能让Socket返回false,当IP地址上的给定端口没有打开时,请告诉我。在此先感谢。

    代码:

    这里我调用套接字方法(portIsOpen),如果它返回true,我将发送到Method的IP地址附加到我的 Stringbuilder possibleIPAddresses。通过这种方式,我可以列出所有打开端口的IP地址,然后再连接到它们。

    //Initialisiert Variablen für den Port Prüfer
    public StringBuilder possibleIPAddress = new StringBuilder("");
    final ExecutorService es = Executors.newFixedThreadPool(50);
    final int timeout = 500;
    final List<Future<Boolean>> futures = new ArrayList<>();
    
    //Code for querying IP Adress here.
    
    //Checking all IP-Addresses from 10.0.0.1-10.0.0.255 for open SSH Port
    String ip = "";
    for (int x=1;x<=10;x++) {
        ip = "10.0.0."+x;
    
        //Should return true if port on IP-Address is open, but returns true everytime..help?
        if (futures.add(portIsOpen(es, ip, 22, timeout))) {
            possibleIPAddress.append(ip).append("\n");
        }
    
        es.shutdown();
    
    }
    

    以下是端口扫描程序的代码(与端口扫描程序问题相同)

    public static Future<Boolean> portIsOpen(final ExecutorService es, final String ip, final int port, final int timeout) {
        return es.submit(new Callable<Boolean>() {
            @Override public Boolean call() {
                try {
                    Socket socket = new Socket();
                    socket.connect(new InetSocketAddress(ip, port), timeout);
                    socket.close();
                    return true;
                } catch (Exception ex) {
                    return false;
                }
            }
        });
    }
    

1 个答案:

答案 0 :(得分:0)

您的portIsOpen()方法返回Future,其结果是您永远不会得到的,因此您的方法根本不会返回任何内容,因为它永远不会被调用。当且仅当Future结果true时,您才需要添加到可能的IP地址列表中。

注意,如果出现异常,你也会泄漏套接字。使用try-with-resources语法来解决此问题。