2012-05-30 63 views
0

我正在写一个端口扫描仪在java作为教育练习,我遇到了一个问题。 当我扫描本地计算机上的端口时,我的程序工作正常,但是当我尝试扫描foriegn计算机上的端口时,该进程只是冻结。下面是我的扫描方法的代码:扫描外国主机的端口

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"); 
     } 
    } 
} 

到目前为止,这是工作时的主机名是我的回送地址,或只是“localhost”的,它甚至与我的IP地址的作品。但是,当我例如解析www.google.com的IP或者甚至在同一网络上提供其他计算机的IP地址时,程序将在扫描第一个端口后冻结。

我解决这样的IP地址:

inetAddressObject = InetAddress.getByName(hostNameString); 

谁能告诉我,如果我是一个外部主机上缺少本地计算机和扫描端口扫描端口之间有很大的区别?还是只有一些简单的错误与我的代码?

+1

如果您成功打开套接字,则需要关闭套接字。 – EJP

回答

3

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

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

其他原因是它为什么超时。这是因为您的计算机可能位于某种防火墙的后面,与您的代码示例无关。