【问题标题】:Java Port Scanner is Missing Open PortsJava 端口扫描程序缺少开放端口
【发布时间】:2015-02-10 11:58:07
【问题描述】:

作为一个更大项目的切线,我正在尝试实现一些代码来扫描开放端口,以便我最终可以运行数据包测试。目前我只是想连接到 google.com 并且我知道端口 80 接受连接,所以我已经格式化了我的代码以扫描包括这个端口在内的一系列端口。但是,虽然我可以直接连接到端口 80,但扫描仪代码似乎通过了它。我想知道是否有人有任何想法?

public class PortScanner {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        String host = "www.google.com";

        System.out.println("Attempting to connect to " + host + " at port 80...");
        try {
            socket.connect(new InetSocketAddress(host, 80), 5000);
            System.out.println("Connection Successful.");
        }
        catch (Exception e) {
            //Just bypass the exceptions for now
        }

        System.out.println("Scanning for open ports on " + host);


        for (int i = 75; i < 85; i++) {
            System.out.println("Attempting to connect to " + host + " on port " + i);
            try {
                socket.connect(new InetSocketAddress(host, i), 5000);
                System.out.println("Open port found at " + i);
            }
            catch (ConnectException e) {
                System.err.println("Connect Exception Thrown on Port " + i);
                continue;
            }
            catch (SocketException e) {
                System.err.println("Socket Exception Thrown on Port " + i);
                continue;
            }
            catch (UnknownHostException e) {
                System.err.println("Unknown host at " + host);
                System.exit(1);
            }
        }

        System.out.println("Closing connection to " + host);
        socket.close();
        System.out.println("Connection closed");
    }
}

其实循环报告80端口抛出了一个SocketException:

Attempting to connect to www.google.com at port 80...
Connection Successful.
Scanning for open ports on www.google.com
Socket Exception Thrown on Port 75
Socket Exception Thrown on Port 76
Socket Exception Thrown on Port 77
Socket Exception Thrown on Port 78
Socket Exception Thrown on Port 79
Socket Exception Thrown on Port 80
Socket Exception Thrown on Port 81
Socket Exception Thrown on Port 82
Socket Exception Thrown on Port 83
Attempting to connect to www.google.com on port 75
Socket Exception Thrown on Port 84
Attempting to connect to www.google.com on port 76
Attempting to connect to www.google.com on port 77
Attempting to connect to www.google.com on port 78
Attempting to connect to www.google.com on port 79
Attempting to connect to www.google.com on port 80
Attempting to connect to www.google.com on port 81
Attempting to connect to www.google.com on port 82
Attempting to connect to www.google.com on port 83
Attempting to connect to www.google.com on port 84
Closing connection to www.google.com
Connection closed

控制台日志按顺序出现的事实让我想知道连接尝试是否可能进入得太快,从而导致程序错过可用端口,但我不是真的知道该怎么做。

任何想法表示赞赏!

【问题讨论】:

  • 您是否考虑过 Google 可能会阻止您,因为您正在对其中一台机器执行未经授权的端口扫描。您应该针对自己的工具包进行测试,而不是其他人。
  • 我没有考虑过这个!在更大的背景下,我正在尝试构建一个 ping 测试器,我在 Java 中理解这意味着您需要一个套接字连接。如果您不确切知道要连接到哪个端口,并且无法扫描端口,还有什么其他选择?
  • 可能没有其他选择。但谷歌会公开宣传他们提供的服务,因此会觉得有理由阻止那些试图寻找其他东西的客户。在不触发检测系统的情况下测试服务的存在性有很多工作要做。在某种程度上,这是一场猫捉老鼠的游戏。您可以考虑研究 nmap 之类的工具。
  • 感谢您的想法@PhilipWhitehouse,感谢您的意见。我将不得不重新考虑如何实现我的目标,但我想这都是乐趣的一部分......

标签: java serversocket port-scanning


【解决方案1】:

Socket 最多只能用于 1 个活动连接!而且由于您在端口扫描开始时连接(并且只在最后关闭它),任何进一步的连接尝试(通过调用connect() 方法)都会抛出SocketException

打印您的SocketException 的消息以验证这将是:"already connected"

建议:在每次尝试之前创建一个新的Socket。请注意,Socket 不能重用用于多个/新连接。引用Socket.close()的Javadoc:

一旦套接字被关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。需要创建一个新的套接字。

【讨论】:

  • 非常感谢您的解释,帮助很大。我在这里涉足全新的领域!只是出于好奇,如果我每次更改代码以创建一个匿名的 Socket 实例,我该如何关闭这些实例(即没有名称可引用?)
  • @lordchancellor 不要匿名创建它。使用try-with-resources 块,一旦执行离开块,它将自动关闭Socket
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多