端口扫描程序设计与实现
课程设计报告
( 2014-- 2015年度第2学期)
名 称: 网络综合实验 题 目: 院 系: 计算机系 班 级: 网络1202 学 号: 学生姓名: 指导教师:李丽芬 曹锦刚 刘晓峰 设计周数: 2周
成 绩:
日期:2015 年 7 月 5
日
网络综合实验
任 务 书
一、实验名称:端口扫描程序设计与实现 二、目的与要求
1. 任务:设计并实现一个端口扫描程序,检测某个IP 或某段IP 的计算机的端口工作情况。 2. 目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。
3. 要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。
4. 学生人数:1人。
三、主要内容
1. 编写一个端口扫描程序,能够显示某个IP 或某段IP 的计算机的某一个或某些端口是否正在工作。(1) 设定好一定的端口扫描范围,并设定每个端口扫描的次数,因为有可能有的端口一次扫描可能不通;(3) 创建socket ,通过socket 的connect 方法来连接远程IP 地址以及对应的端口;(4) 如果返回false ,表示端口没有开放,否则端口开放。
四、进度计划
五、设计成果要求
1. 完成规定的实验任务,保质保量;
2. 完成综合实验报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对实验思路的归纳和对问题解决过程的总结。
六、 考核方式
1. 平时成绩+验收答辩+实验报告; 2. 五级分制。
学生姓名:韦笑
指导教师:李丽芬 曹锦刚 刘晓峰 2015 年7 月 5 日
一、综合实验的目的与要求
1.目的:加深对《计算机网络体系结构》课程知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,加深对JAVA 编程语言的使用,促进编程能力的提高,同时为网络编程打下一个比较好的基础。同时对实验的过程要有完全的了解。
2. 要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。 二、综合实验正文
1、主要方法
TCP 是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。发送方和接收方的成对的两个socket 之间必须建 立连接,以便在TCP 协议的基础上进行通信,当一个socket (通常都是server socket)等待建立连接时,另一个socket 可以要求进行连接,一旦这两个socket 连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。
本实验在一台主机创建socket ,与远程主机的某一个端口建立TCP 连接,通过java 中的
isConnected() 函数判断连接是否建立成功,若连接建立成功,说明该端口开放;否则不开放。 2、实验流程图
3、实验优化
使用socket 创建tcp 连接时,若连接建立不成功,则程序抛出异常,但会有一定的时延。为了加快扫描速度,程序使用了多线程技术,每个线程扫描10个端口,并发执行所有线程。这样就大大加快了扫描速度。
4、实验结果
三、实验总结
本实验通过建立tcp 连接来扫描远程主机端口是否开放,使我们更加深入地理解了TCP/IP协议的原理,加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念。这次实验也锻炼了我java 的编程能力,掌握了socket 编程的各种函数和方法。
实验中也出现了一些问题,比如扫描远程主机端口的速度要比扫描本主机端口速度慢很多,解决方法是关闭远程主机的防火墙。感谢老师的指导!
源代码:
package 端口扫描;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
public class test extends Thread{ private int[] p; Socket ss = null; CountDownLatch latch; private String ipAddress; private int port;
public test(int[] p,CountDownLatch latch,int port,String ipAddress) { this.p = p; this.latch=latch; this.ipAddress=ipAddress; this.port=port; }
public void run() {
//System.err.println("启动线程"); for(int i=p[0]; i
//System.out.println(i);
ss = new Socket(ipAddress,i);
if(ss.isConnected()){System.err.println("端口 " + i+"空闲");} ss.close(); } catch (Exception e) {System.out.println("端口 " + i+"占用");}
}
latch.countDown();
//System.out.println(latch.getCount()); } }
package 端口扫描;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
public class test2 {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = null; String ip; String ipAddress1; String ipAddress2; String ipAddress3; String ipAddress41; String ipAddress42;
System.out.print("输入起始ip 地址:"); Scanner s=new Scanner(System.in); ip=s.next();
String[] strs = ip.split("\\."); ipAddress1= strs[0]; ipAddress2 = strs[1]; ipAddress3 = strs[2]; ipAddress41 = strs[3];
System.out.print("
输
入
终
址:"+ipAddress1+"."+ipAddress2+"."+ipAddress3+"."); ipAddress42=s.next();
int start=Integer.parseInt(ipAddress41); int end=Integer.parseInt(ipAddress42); System.out.print("输入起始端口:"); double startport=s.nextInt(); System.out.print("输入终止端口:"); double endport=s.nextInt(); s.close();
int th=(int) Math.ceil((endport-startport+1)/10); System.out.println("开启"+th+"线程"); for(int num=start;num
latch=new CountDownLatch(th);
止
ip
地
String ipAddress = ipAddress1+"."+ipAddress2+"."+ipAddress3+"."+num; System.out.println(ipAddress+"--------------------"); for(int i=(int)startport;i
}
latch.await();
}
} }