【问题标题】:Socket Connection always returns true even if Port is not open (Port Scan)即使端口未打开,套接字连接也始终返回 true(端口扫描)
【发布时间】:2016-04-10 00:48:22
【问题描述】:

问题:

我有这个 FOR 语句,它调用具有不同 IP 地址的方法(范围从 10.0.0.1 到 10.0.0.255,因为我没有 IP 扫描器)。此方法是 Future Callable 并返回布尔值 true 或 false。 该方法的作用基本上是制作一个Socket,以给定的IP和端口+超时连接到这个Socket,并根据给定的IP地址返回true或false,端口是否打开.

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


待办事项:

  1. 从 Android 设备获取 IP(选中
  2. 过滤它,如果它是一个以“10”开头的私有IP。 && "10.0.0."或“192”。 &&“192.168”。等等(选中
  3. 检查端口 22 是否在“10.0.0.1-255”或“192.168.1.1-255”范围内打开。 (当前

我使用此处的代码用于端口扫描器:Socket Port Scanner 在这个问题中,如果固定 IP 地址上的端口打开与否,Future Method 返回 true 或 false。然后将此方法的结果添加到未来布尔列表数组中。然后查询,用户可以看到这个固定IP地址上打开了多少端口。

我对其进行了修改,因此该方法正在扫描多个 IP 地址以查找固定端口,然后将 IP 地址(如果 SSH 端口打开)添加到未来布尔列表数组中。除了 socket.connect(new InetSocketAddress(ip, port), timeout); 始终返回 true 之外,此方法有效。我尝试查看它的代码以了解它为什么这样做,但我没有找到答案。如果您有任何想法如何让 Socket 返回 false,当 IP 地址上的给定端口未打开时,请告诉我。提前致谢。

代码:

这里我调用 Socket 方法 (portIsOpen),如果它返回 true,我将发送到方法的 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;
            }
        }
    });
}

【问题讨论】:

    标签: android sockets ssh ip port


    【解决方案1】:

    你的portIsOpen() 方法返回一个Future,你永远不会得到它的结果,所以你的方法永远不会返回任何东西,因为它永远不会被调用。当且仅当 Futureresulttrue 时,您才需要添加到可能的 IP 地址列表中。

    注意,在出现异常的情况下,您也会泄漏套接字。使用try-with-resources 语法来解决这个问题。

    【讨论】:

    • 感谢您的回答,但是当我尝试此操作时,它仍然每次都返回 true:System.out.println(futures.add(portIsOpen(es, ip, 22, timeout)));... 这意味着该方法正在执行套接字然后返回 true,所以我得到了结果, 不 ?。我确实指定了当且仅当结果为真时,因为if (futures.add(portIsOpen(es, ip, 22, timeout)))if (futures.add(portIsOpen(es, ip, 22, timeout)) == true) 相同。你能帮帮我吗?
    • 我将如何实现 try-with-resources?我试过这个:try (Socket socket = new Socket(socket.connect(new InetSocketAddress(ip, port), timeout))){ } 但它告诉我变量套接字可能没有被初始化。
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多