2015-02-10 46 views
0

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

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 

在控制台日志的顺序出来的事实,他们都让我怀疑,如果连接尝试可能会过快,从而导致程序错过可用的端口,但我不确定该怎么做。

任何想法赞赏!

+1

您是否认为Google可能会阻止您,因为您正在对其中一台机器执行未经授权的端口扫描。你应该对自己的套件进行测试,而不是别人的测试。 – 2015-02-10 12:00:21

+0

我没有考虑过这个!在更大的背景下,我试图构建一个ping测试器,我在Java中理解意味着您需要套接字连接。如果您不知道要连接哪个端口,并且无法扫描端口,那么还有什么其他选项? – lordchancellor 2015-02-10 12:04:36

+1

可能没有其他选择。但谷歌会公开他们提供的服务,因此会阻止试图寻找其他内容的客户。 测试服务的存在已经做了很多工作,但没有触发检测系统。这在某种程度上是一种猫和老鼠的游戏。你可能会考虑研究像nmap这样的工具。 – 2015-02-10 12:07:27

回答

1

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

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

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

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

+0

非常感谢您的解释,这是一个巨大的帮助。我在这里涉足全新的领域!出于好奇,如果我每次更改代码以创建一个Socket的匿名实例,我该如何关闭这些实例(即没有提及名称?) – lordchancellor 2015-02-10 14:46:24

+0

@lordchancellor不要匿名创建它。使用'try-with-resources'模块,一旦执行离开模块,它将自动关闭'Socket'。 – icza 2015-02-10 14:49:06