Linux多线程端口.doc
文本预览下载声明
四 川 大 学 计 算 机 学 院、软 件 学 院
实 验 报 告
学号:__1143111006 _ 姓名:_刘家豪_ 专业:_软件工程_ 班级:_5班_ 第 8 周
课程名称 信息安全产品开发实践实验课时3实验项目并发服务器II——多线程实验时间2013.10.25 15:00-
-2013.10.25 16:00实验目的 修改远程控制程序服务器程序,将其从循环模式或多进程模式修改为多线程模式
实现一个多线程端口扫描程序:
要求:
能同时扫描5个IP地址;
针对每个iP地址,开设100个线程对其进行扫描;
如果端口打开,使用函数getservbyport获取其服务名,在屏幕上打印:IP port servername,如果是未知服务,则屏幕显示:ip port unkonown实验环境 ? Windows7 64-bit VMware 9.0 RedHat Enterprise Linux 6.0
实验内容(算法、程序、步骤和方法) 第一个实验:修改远程控制程序服务器程序,将其从循环模式或多进程模式修改为多线程模式。
这个实现起来比较简单,就是在上次TCP C/S架构通讯的基础上稍加修改就可以了,上次的tcp通讯程序了,在server端,每当有客户端发起连接后都由服务器直接在一个while循环里与其建立服务,现在,我们改为:每当有客户端发起连接时,就创建一个线程来为其服务:
这里使用的是分离线程,因为这里也不可能用到pthread_join函数来等待子线程,所以,子线程是自己释放空间的。
第二个实验:多线程端口扫描。
我这里就把程序结构和我的思路联合起来讲吧:
为了方便调试,我自己定义了一个错误信息输出函数,内容如下:
_LINE_是C程序自定义的一个宏,_FILE_也是,作用分别是发生错误的代码行数和文件。(很好用的)
然后定义一个结构体来存放要扫描的主机信息:
因为我们要同时扫描5个主机,所以待会可能就是直接声明一个Port数组了。
既然要实现端口扫描,那么,我也可以将任务分解下,可以分解为扫描一个固定主机的一个范围的端口,在此分解下,又可以分为扫描一个固定主机的固定端口,当然,实际上我也是这么做的。
那么首先看下怎么实现扫描一个固定主机的一个端口:
原理很简单,就是直接对该主机的某一端口号发??TCP连接,看返回值就行了。
代码上也有注释,我就不细说了。
那么再过来就是实现扫描某一主机的一个范围的端口了:
这个就先讲下原理吧:也很简单,就是用一个循环来给一个sockaddr_in的结构体的端口号依次赋不同的值,然后再执行扫描该主机该端口号就行了,而这个上面已经实现了。
下面是扫描一个主机的一个范围的端口号,原理上面已经解释了,而且下面代码里也有部分注释,所以这个函数应该很清晰了:
接下来就直接看主函数了:
主函数的开始部分没啥说的了,声明相关变量下面要用,因为我的这个程序是可以实现多主机多端口扫描的,所以在执行程序时要输入相关变量:比如说要扫描哪些主机,要扫描的端口号的范围,以及想要并发多少线程扫描,这些信息都是通过输入来确定的,主函数的开始部分代码为:
当然,输入参数不正确会有提示信息的。
下一步也很清楚了,既然输入了参数,肯定是要解析这些参数并初始化相关变量吧:
要解析的参数也不用说了吧,就IP地址,端口号和并发的线程数。上面代码中最后一行语句是为线程分配地址空间。
接下来就是主要部分了,实现并发扫描:
代码中第一行输出语句是提示信息,后面则是通过两个循环来实现多主机一个范围端口的扫描,这里用的是联合线程,我们通过pthread_join函数来实现等待子线程结束,但最后要记得释放线程空间,否则造成内存泄露就不好了。总而言之,就是这样实现了。
下面就是编译运行了。
首先是第一个实验:
编译运行文件如下(POSIX线程库不是Linux的默认库,所以编译时要加上-lpthread)
从程序运行结果来看,完成了预期功能。
第二个实验编译与运行结果:
当然,输入时可以输入多个IP地址(限制5个),我这里演示只输入了两个。从程序运行结果来看,达到了预期目标。数据记录
和计算
无
结 论
(结 果)
见实验内容部分
小 结 怎么说呢,这次试验加深了对多线程的理解,第一个实验并不难,也就注意两点就行了:第一就是注意释放空间或使用分离线程,第二是注意使用线程,因为有可能结果是两个客户端的通信会出问题。反正加很小一段代码就可以实现。第二个实验稍加难一点,因为在使用多线程的基础上,还要考虑并发扫描多主机多端口以及对线程空间的释放。也许这个实验里除了多线程,本身Linux编程也占一部分吧。但这只能说让我加深了对Linux编程的理解吧。端口扫描,上次实
显示全部