我在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");
}
}
}
到目前为止,当主机名是我的环回地址或只是&#34; localhost&#34;时,它正在工作,它甚至适用于我的IP地址。但是,当我为www.google.com解析IP或甚至在同一网络上为其他计算机提供IP地址时,程序将在扫描第一个端口后冻结。
我正在解析这样的IP地址:
inetAddressObject = InetAddress.getByName(hostNameString);
有人能告诉我,如果我在本地计算机上扫描端口和扫描外部主机上的端口之间缺少一个很大的区别吗?或者我的代码出现了什么问题?
答案 0 :(得分:3)
您调用Socket构造函数的方式将立即建立连接。问题是,如果连接超时,则必须等待一段时间(操作系统默认值)。你应该这样做的方法如下:
Socket s = new Socket();
s.connect(new InetSocketAddress(ad, i), timeout);
另一个原因是为什么它超时。这是因为您的计算机可能位于某些类型的防火墙之后,与您的代码示例无关。