【问题标题】:Scanning Foreign Host's Ports扫描外部主机的端口
【发布时间】:2012-05-30 23:38:19
【问题描述】:

我在 Java 中编写一个端口扫描器作为一个教育练习,我遇到了一个问题。 当我扫描本地计算机上的端口时,我的程序运行良好,但是当我尝试扫描外国计算机上的端口时,进程就会冻结。这是我的扫描方法的代码:

public void scan(InetAddress ad, int start, int end){
    for(int i=start; i<=end; i++){
        try{
            socket = new Socket(ad, i);
            System.out.println("Port "+i+"is open");
        }catch(Exception e){
            System.out.println("Port "+i+"is not open");
        }
    } 
}

到目前为止,当主机名是我的环回地址或只是“本地主机”时它可以工作,它甚至可以与我的 IP 地址一起工作。但是,例如,当我解析 www.google.com 的 IP 或什至将我在同一网络上的另一台计算机的 IP 地址给它时,程序将在扫描第一个端口后冻结。

我正在这样解析 IP 地址:

inetAddressObject = InetAddress.getByName(hostNameString);

谁能告诉我我是否遗漏了在本地计算机上扫描端口和在外部主机上扫描端口之间的重大区别?还是我的代码有一些简单的问题?

【问题讨论】:

  • 如果成功打开套接字,则需要关闭它们。

标签: java network-programming port-scanning


【解决方案1】:

您调用 Socket 构造函数的方式将立即建立连接。问题是如果连接超时,那么您将不得不等待一段时间(操作系统默认)。你应该这样做的方式如下:

Socket s = new Socket();
s.connect(new InetSocketAddress(ad, i), timeout);

另一个原因是它超时的原因。这是因为您的机器可能位于某种防火墙之后,并且与您的代码示例无关。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 2018-06-07
    • 2016-04-22
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多