不是楼上说的意思我在用java做端口扫描器public Socket(String host, int port) throws UnknownHostException, IOException 这是API里的构造方法我看网上别人做的java扫描器,new socket(ip,port)如果出异常,就认为端口没有打开。但是当端口为21的时候,ip除了本机地址,是别的任何地址,不管那个ip存在不存在,也不管21端口打开没打开,都没有exception。判断不了21端口是否打开。有什么办法判断21端口是否开放
怎么可能啊,肯定会报异常的,可能不会马上出现异常,因为socket是有时间限制的,时间到了才会抛出异常try { Socket socket=new Socket("111.111.111.2",21); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }十几秒以后java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at run.Test.main(Test.java:15)
我再测试一次。。 import java.net.*; import java.io.*;public class Test21 { public static void main(String[] args) {
try { Socket socket=new Socket("111.111.111.2",22); } catch (UnknownHostException e) { System.out.println("22端口抛出的异常"); e.printStackTrace(); } catch (IOException e) { System.out.println("22端口抛出的异常"); e.printStackTrace(); } } }这个是你的程序,我在我机子上运行,21,22都出现异常,打印结果如下: 21端口抛出的异常 java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at csdn4_29.Test21.main(Test21.java:11) 22端口抛出的异常 java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at csdn4_29.Test21.main(Test21.java:21) 估计是你机子哪里出了问题·
要是自己的用其他的端口最好1000以上的
int port)
throws UnknownHostException,
IOException
这是API里的构造方法我看网上别人做的java扫描器,new socket(ip,port)如果出异常,就认为端口没有打开。但是当端口为21的时候,ip除了本机地址,是别的任何地址,不管那个ip存在不存在,也不管21端口打开没打开,都没有exception。判断不了21端口是否打开。有什么办法判断21端口是否开放
Socket socket=new Socket("111.111.111.2",21);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}十几秒以后java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
at run.Test.main(Test.java:15)
import java.net.*;
import java.io.*;public class Test21 {
public static void main(String[] args) {
try {
Socket socket=new Socket("111.111.111.2",21);
} catch (UnknownHostException e) {
System.out.println("21端口抛出的异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("21端口抛出的异常");
e.printStackTrace();
}
try {
Socket socket=new Socket("111.111.111.2",22);
} catch (UnknownHostException e) {
System.out.println("22端口抛出的异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("22端口抛出的异常");
e.printStackTrace();
}
}
}运行结果:22端口抛出的异常
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at Test21.main(Test21.java:18)
发呆中,崩溃ing
对方机器没打开的端口,连接过去应该都是超时的,为什么21端口的反应就不一样呢?现在改了扫描方式,不用直接用new Socket()
用下面的方式,设置timeout为50try {
SocketAddress sa = new InetSocketAddress(ip,port);
Socket temp=new Socket();
temp.connect(sa, timeout);
temp.close();
System.out.println(ip + ":" + port);
}catch(Exception e) {
}扫描结果仍然所有机器的21端口打开
网上逛了几天,发现了个Jpcap,或者该从底层弄了囧
用Socket去扫描一个本机地址以外的任何IP,只要是21端口,就算没有那个IP的主机,不抛异常囧囧囧囧囧囧囧囧
public class Test21 {
public static void main(String[] args) {
try {
Socket socket=new Socket("111.111.111.2",21);
} catch (UnknownHostException e) {
System.out.println("21端口抛出的异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("21端口抛出的异常");
e.printStackTrace();
}
try {
Socket socket=new Socket("111.111.111.2",22);
} catch (UnknownHostException e) {
System.out.println("22端口抛出的异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("22端口抛出的异常");
e.printStackTrace();
}
}
}这个是你的程序,我在我机子上运行,21,22都出现异常,打印结果如下:
21端口抛出的异常
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at csdn4_29.Test21.main(Test21.java:11)
22端口抛出的异常
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at csdn4_29.Test21.main(Test21.java:21)
估计是你机子哪里出了问题·
但是变成25端口都不正常,不抛异常
我 !@#$#%#%$^#*&^*&^%*%%我机器没装什么程序,就360安全卫士,antiarp防火墙,QQ常开着。把所有程序关掉,剩下explorer和一些系统的进程,都还是扫描对方21端口出问题。中病毒也不至于把机器搞成这么奇怪啊。
没法了重装系统去。
关掉之后,一切正常之前重装了系统还有问题,应该是防火墙会自动打开
原因仍然不明白,怎么说,也不至于windows的防火墙把所有别的IP的21端口,都给连通了不过问题搞定了,结贴吧。