1、1网络程序设计实验报告实验名称: winsock 端口扫描试验 指导教师: 贾浩 专业班级: 姓 名: 学 号: 实验地点: 实验日期: 实验成绩: _21、实验目的 了解端口扫描的基本概念和工作原理;2、实验设计(一)实验要求如下:编写一个利用全连接的端口扫描程序,能显示目标主机的端口开放情况。要求能在命令行输入要扫描的目标主机和端口范围。比如:scan *.*.*.* nnnn-mmmm。(二)、设计:1、字符串处理。实验中需要对用户输入的字符串进行处理,从中获取到要扫面的 IP地址和端口号范围。可先用一个字符串保存整个命令语句,然后检测到其中的第一个空格和第二个空格,在两个空格之中的内容
2、即是需要检测的 IP 地址,然后获取到第二个空格和第一个横线之间的内容,并将其转换为整型数据,此为需要扫描的端口的起始端口号,最后获取到横线之后的数据,将其转化为整型数据,即需要扫面端口的终止端口号。2、设计主程序。先创建一个 TCP 类型的套接字,将其绑定到本地地址,然后将要发送数据的 IP 地址设置为从用户命令中获取到的数据,紧接着在一个循环中,将在需要扫描的端口的范围内的数据依次赋值给要发送数据的端口号,然后调用 connect 函数,并等待对方响应连接,若得到响应则表示该端口正常开启,否则表示该端口关闭,并在控制台中打印其开关情况。3、程序流程图如下:扫描端口程序流程图33、实验过程1
3、针对实验要求设计代码2编写代码实现要求3实验结果全开扫描:半开扫描:4、讨论与分析1. 阐述全连接扫描的原理。答:全连接扫描是 TCP 端口扫描的基础,现有的全连接扫描有 TCP connect()扫描和 TCP 反向 ident 扫描等。其中 TCP connect()扫描的实现原理如下所述:扫描主机通过TCP/IP 协议的三次握手与目标主机的指定端口建立一次完整的连接。连接由系统调用connect 开始。如果端口开放,则连接将建立成功;否则,若返回-1 则表示端口关闭。建立连接成功:响应扫描主机的 SYN/ACK 连接请求,这一响应表明目标端口处于监听(打开)的状态。如果目标端口处于关闭状
4、态,则目标主机会向扫描主机发送 RST 的响应。2. 你的程序是否考虑了扫描效率?如没有考虑你准备如何改进?答:我的程序使用的全连接扫描,没有考虑扫描效率。可以尝试使用半连接扫描,若端口扫描没有完成一个完整的 TCP 连接,在扫描主机和目标主机的一指定端口建立连接时候只完成了前两次握手,在第三步时,扫描主机中断了本次连接,使连接没有完全建立起来,这样的端口扫描称为半连接扫描,也称为间接扫描。使用这种连接的优点在于即使日志中对扫描有所记录,但是尝试进行连接的记录也要比全扫描少得多,从而提高了扫描效率。五、实验者自评通过本次实验,对端口扫描的基本概念和常用的基本方法有了熟悉和掌握,尤其是对全连接扫
5、描和半连接扫描有了深入的认识,其各自的实现方法和优缺点也有所了解。对基本的 windsock API 函数的使用方法和实现原理有了更深入的了解,对 TCP 客户端编程有了更深刻的理解。在实验过程中,熟悉了网络编程方法,尤其是查阅资料并熟悉了 TCP 建立连接的三次握手过程,重新温习了对字符串的操作,对自己的编程动手能力有了较好的锻炼和提高。通过完成实验,对 TCP 编程的知识有了进一步了解,重新认识了其重要性,并对课堂上学习的知识进行了巩固。在实验过程中,我认真对待,态度积极,独立了完成实验任务。43、附录:关键代码/ 填写远程地址信息sockaddr_in addr; addr.sin_fa
6、mily = AF_INET;/设置获取的用户输入 IP 地址为远程 IP 地址addr.sin_addr.S_un.S_addr = inet_addr(strIP);for ( i = atoi( starPort ); i = atoi( endPort ); i+ )/没扫描一个端口创建一个新的套接字SOCKET s = :socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/如果套接字创建失败则返回错误if(s = INVALID_SOCKET)printf(“Failed socket() %d n“, :WSAGetLastError();return -1;/设置远程地址信息中的端口号为需要扫描的当前端口号addr.sin_port = htons(i);/连接设置好的远程地址,如果连接失败则表示端口关闭if ( :connect(s, (sockaddr*)/连接成功则表示端口开启elseprintf( “%s:%d 端口开启n“, strIP, i );:closesocket(s);