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

Android 即使端口未打开,套接字连接始终返回true(端口扫描) 问题:,android,sockets,ssh,ip,port,Android,Sockets,Ssh,Ip,Port,我有一个FOR语句,它调用具有不同IP地址的方法(从10.0.0.1到10.0.0.255不等,因为我没有IP扫描器)。此方法是未来可调用的,并返回布尔值true或false。 该方法的功能基本上是创建一个套接字,使用给定的IP和端口+超时连接到此套接字,并根据给定的IP地址、端口是否打开返回true或false 我的计划: 我正在尝试检查连接到同一WIFI网络的设备是否有开放端口(SSH端口),这样我就可以在不知道其IP地址的情况下通过SSH连接到此设备。我的想法是获取Android设备的私有

我有一个FOR语句,它调用具有不同IP地址的方法(从10.0.0.1到10.0.0.255不等,因为我没有IP扫描器)。此方法是未来可调用的,并返回布尔值true或false。 该方法的功能基本上是创建一个套接字,使用给定的IP和端口+超时连接到此套接字,并根据给定的IP地址、端口是否打开返回true或false

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


待办事项:

  • 从Android设备获取IP(选中)
  • 如果它是以“10.”和“10.0.0.”或“192.”和“192.168.”等开头的私有IP,则对其进行过滤(选中
  • 检查端口22是否在“10.0.0.1-255”或“192.168.1.1-255”范围内打开。(当前
  • 我在这里为端口扫描器使用了代码:在这个问题中,如果固定IP地址上的端口是否打开,Future方法将返回true或false。然后将此方法的结果添加到未来的布尔列表数组中。然后查询,用户可以看到这个固定IP地址上打开了多少端口

    我对它进行了修改,这样该方法就可以扫描一个固定端口的多个IP地址,然后将SSH端口打开时的IP地址添加到未来的布尔列表数组中。除了
    socket.connect(新的InetSocketAddress(ip,端口),超时)之外,此功能正常工作始终返回true。我试着查看它的代码,看看它为什么会这样做,但我没有找到答案。如果你知道当IP地址上的给定端口未打开时,如何让套接字返回false,请告诉我。提前谢谢

    代码: 这里我调用套接字方法(
    portIsOpen
    ),如果它返回true,我将发送到该方法的IP地址附加到我的Stringbuilder
    可能的IP地址中。这样,我可以列出所有打开端口的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();
    
    }
    
    //初始化插入变量für den Port Prüfer
    public StringBuilder possibleIPAddress=新StringBuilder(“”);
    final Executors Service es=Executors.newFixedThreadPool(50);
    最终int超时=500;
    最终列表期货=新的ArrayList();
    //此处用于查询IP地址的代码。
    //正在检查10.0.0.1-10.0.0.255之间的所有IP地址以打开SSH端口
    字符串ip=“”;
    对于(int x=1;x你的
    portIsOpen()
    方法返回一个
    未来
    ,你永远不会得到它的结果,因此你的方法永远不会返回任何东西,因为它从未被调用。当且仅当
    未来
    的结果为
    时,你需要将其添加到可能的IP地址列表中


    注意:在出现异常的情况下,您也会泄漏套接字。请使用
    try with resources
    语法来修复此问题。

    谢谢您的回答,但每次尝试时,它仍然返回true:
    System.out.println(futures.add(portIsOpen(es,ip,22,timeout)));
    …这意味着该方法正在执行套接字,然后返回true,因此我得到的结果是no?。我确实指定了当且仅当结果为true,因为
    if(futures.add(portIsOpen(es,ip,22,timeout)))
    if(futures.add(portIsOpen(es,ip,22,timeout))==true相同
    。您能帮助我吗?我将如何使用资源输入元素?我尝试了以下方法:
    try(Socket Socket=new Socket(Socket.connect(new InetSocketAddress(ip,port,timeout)){}
    但它告诉我变量Socket可能尚未初始化。
    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;
                }
            }
        });
    }