




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 课程设计目的(1)了解探测远程主机是否可达的方法。(2)了解windows网络编程的基本步骤。(3)了解TCP/IP协议及ICMP协议。(4)掌握ping命令的思想。(5)掌握Windows Socket API的使用方法。2 课程设计原理ICMP:互联网控制报文协议,提供一个特殊的报文在互联网的结点之间进行监测和控制,测试目的主机是否可达,与本次课程设计目的一致,因此可模拟ICMP的工作方式来编制程序。首先通过生成一个ICMP“回应请求”,然后将其定向至打算查询的目标主机,远程主机会拦截这个请求,然后生成一条回应答复消息,再通过网络回传给我们。若是不能抵达目标主机,则会生成相应的错误消息。具体步骤如下:1) 创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。2) 创建并初始化ICMP头。3) 调用sendto将ICMP请求发给远程主机。4) 调用recvfrom以接收ICMP响应。其流程图如下:3 程序源代码及运行结果31 源代码#include #include #pragma comment( lib, ws2_32.lib ) #define ICMP_ECHO 8 /回应请求类型的ICMP消息类型#define ICMP_ECHOREPLY 0 /回应答复型的ICMP消息类型#define ICMP_MIN 8 / ICMP数据报最小长度#define DEF_PACKET_SIZE 32 /默认数据报大小#define DEF_PACKET_NUMBER 4 /发送数据报的个数 #define MAX_PACKET 1024 /最大ICMP数据报大小char *Ipdest; /目标主机的IP地址int datasize; /ICMP消息的长度/接收到的ICMP消息数,每收到一条ICMP消息就加1static int icmpcount=0; /IP头(20字节) struct IPHEAD unsigned int headlength:4; / 4位头长度 unsigned int version:4; / 4位版本 unsigned char tos; / 8位服务类型 unsigned short totallength; / 16位总长 unsigned short ip_id; / 16位标识 unsigned short frag_and_flags; /3个一位标识加分段偏移 unsigned char ttl; /8位存活时间 unsigned char protocal; /8位协议类型 unsigned short ip_checksum; /16位头校验和 unsigned int sourceIP; /32位源IP地址 unsigned int destIP; /32位目标IP地址; / ICMP 头(12字节) struct ICMPHEAD unsigned char type; /类型(0,8) unsigned char code; /代码(0) unsigned short icmp_checksum; /校验和 unsigned short icmp_id; /标识符 unsigned short seq; /序号 unsigned long timestamp; /时间戳; /Fill_icmp_data函数:用于设置ICMP头部,填充ICMP消息void Fill_icmp_data(char * icmp_data, int datasize)ICMPHEAD *icmphead=NULL; char *datapart=NULL; icmphead = (ICMPHEAD*)icmp_data; icmphead-type = ICMP_ECHO; /ICMP_ECHO=8 icmphead-code = 0; /类型为8,代码为0,表示回应请求 icmphead-icmp_checksum = 0;icmphead-icmp_id = (unsigned short)GetCurrentProcessId(); datapart = icmp_data + sizeof(ICMPHEAD);/具体内容的首地址指针 /初始化数据包内容部分 for(int i=0;iheadlength) * 4 ;/获取操作系统启动至今所经过的时间(ms)tick=GetTickCount(); if (bread (iphdrlen + ICMP_MIN) coutToo few bytes from: sin_addr);couttype != ICMP_ECHOREPLY) coutnonecho type type) received;couticmp_id != (unsigned short)GetCurrentProcessId() coutIts someone elses packet!endl;return;/输出收到信息的内容:主机地址,icmp消息序号,回应时间,存活时间coutReply from sin_addr);cout bytes=bread-iphdrlen;cout time: timestamp ms ;cout seq=seq;cout1) cksum+=*buffer+; /求各个16位数字之和 size -=sizeof(unsigned short); if(size) cksum += *(unsigned char*)buffer; cksum = (cksum 16) + (cksum & 0xffff); /高位与低位相加 cksum += (cksum 16); /加上进位 return (unsigned short)(cksum); /取反得到校验和 /Usage函数:表示程序的功能void Usage(char *progname)coutUsage:progname endl;cout host remote machine to Pingendl;coutendl;/ValidateArgs函数:用于给目的地址和数据包大小赋值void ValidateArgs(int argc,char *argv)datasize=DEF_PACKET_SIZE; /数据包大小为DEF_PACKET_SIZE=32if(argc2)Usage(argv0); /只输入一个参数:程序名Ipdest=20; /默认目的地址为:20 else if(argc=2)Ipdest=argv1; /第二个参数为目的地址 /main函数:进行建立套接字,创建ICMP头,设置超时时间,发送和接受数据等。int main(int argc,char*argv)WSADATA wsaData;SOCKET sockRaw=INVALID_SOCKET; sockaddr_in dest,from;int destlen=sizeof(dest), fromlen=sizeof(from), bwrote,bread;char *icmp_data=NULL, *recvbuf=NULL;struct hostent *hp=NULL;unsigned short seq=0; /启动winsock失败,输出错误提示信息if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0) coutWSAStartup failed:GetLastError();coutendl;return -1; ValidateArgs(argc,argv);/创建套接字失败,输出错误信息提示 sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);if (sockRaw = INVALID_SOCKET) coutWSASocket() failed:GetLastError();coutendl;return -1; /设定发送数据时最长等待时间timeout=1000msint timeout=1000;bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO, (char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)coutsetsockopt(SO_RCVTIMEO) failed:WSAGetLastError(); coutendl;return -1; /设定接收数据时最长等待时间timeout=1000mstimeout=1000;bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO, (char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)coutsetsockopt(SO_SNDTIMEO) failed:WSAGetLastError(); couth_addr,hp-h_length); /复制内存dest.sin_family=hp-h_addrtype;coutdest.sin_addr=inet_ntoa(dest.sin_addr);coutendln;elsecoutgethostbyname() failed:WSAGetLastError();coutendl;return -1; /建立一个ICMP数据包datasize+=sizeof(ICMPHEAD); /为要发送的数据申请内存空间,最大值为1024icmp_data=new charMAX_PACKET;/为要接收的数据申请内存空间,最大值为1024recvbuf=new charMAX_PACKET;/分配内存失败,输出提示信息if(!icmp_data)coutnew char failed:WSAGetLastError();coutendl;return -1; /将ICMP信息所在空间清零memset(icmp_data,0,MAX_PACKET);/设置ICMP信息头部 Fill_icmp_data(icmp_data,datasize);/发送和接收数据,循环四次for(int i=0;iicmp_checksum=0; (ICMPHEAD*)icmp_data)-timestamp = GetTickCount(); (ICMPHEAD*)icmp_data)-seq=seq+; (ICMPHEAD*)icmp_data)-icmp_checksum = Checksum(unsigned short*)icmp_data,datasize);/发送数据 bwrote = sendto(sockRaw,icmp_data,datasize,0, (sockaddr*)&dest,destlen); if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) coutRequest timed out.endl; continue; else coutsendto( ) failed:WSAGetLastError(); coutendl; return -1; /显示实际发送的字节数coutPinging inet_ntoa(dest.sin_addr) with ;coutbwrote bytes of data:;coutendl; /接收数据 bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0, (sockaddr*)&from,&fromlen);if (bread = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) coutRequest timed out.endl; continue; coutrecvfrom() failed: WSAGetLastError(); coutendl; return -1;/打开接收到的数据,从中提取ICMP头信息 DecodeICMPHEAD(recvbuf,bread,&from); /等待1s钟Sleep(1000); /输出发送的数据包数、接收的数据包数和丢失的数据包数coutendl;coutPing statistics for inet_ntoa(dest.sin_addr):endl; cout Packets:sent=4,;coutReceived=icmpcount;cout,Lost=DEF_PACKET_NUMBER-icmpcount;cout(float)(DEF_PACKET_NUMBER-icmpcount)/DEF_PACKET_NUMBER)*100;cout%loss);coutendl;/释放资源,关闭winsockif(sockRaw!=INVALID_SOCKET)closesocket(sockRaw);delete recvbuf;delete icmp_data;WSACleanup();return 0;32 运行结果点击“开始”“运行”“cmd”,输入“C:program1Debugzpp.exe+目标主机地址”即可运行程序。3.2.1 不输入目标主机地址时程序默认的目标地址为:“20”,目标主机不可达。3.2.2 输入目标主机地址为“”“”为本地的Lookback地址,能够ping通表明TCP/IP协议没有问题。3.2.3 输入目标主机地址为域名地址“”可见目标主机不可达。4 获取目的地址的另一种方法及结果41 代码用以下函数代替原先的ValidateArgs函数,运行程序时可输入目的地址,而不用在操作系统命令行中输入,主函数不带参数。void Validate(char input100) datasize=DEF_PACKET_SIZE; int i,j,k,l=0;for(i=0;i99;i+) /找到ping这个字符串if(inputi=p&inputi+1=i&inputi+2=n&inputi+3=g)j=i;break;continue; /ping之后是远程主机的地址for(i=j+4;i=0&kk=a&kk=z) k=i;break;continue;/将目标地址赋给dest数组:预先定义的字符串数组for(i=k;inputi!=0;i+)destl=inputi; l+;for(i=l;i79;i+) desti=0;Ipdest=dest; /Ipdest指向地址coutendl;42 运行结果将程序编译,组建,执行,然后从键盘上输入“ping”+目的地址。运行结果与从命令行输入目的地址一样。4.2.1 输入目标主机地址为“” “”为本地的Lookback地址,能够ping通表明TCP/IP协议没有问题。4.2.2 输入目标主机地址为域名地址“”可见目标主机不可达。5 心得刚刚拿到课题时,我只能说知道其中的ping怎么用。至于编程来实现它,则没什么头绪。课程设计的要求是采用Windows Socket API的相关函数实现。但是对于Windows Socket API,我知之甚少。于是去图书馆借了好几本书,在网上下载了资料无数,开始了三周的编程生涯。过程中遇到过很多一开始看似不可克服的难题。网络编程中有各种现成的函数,只要包含相应的头文件和库都可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年律师资格考试法律常识预测题及解析
- 2025年特岗教师招聘考试初中生物考试技巧与策略
- 2025年专业物资仓储与运输调度员招聘模拟题集及答案解析
- 2025年特岗教师招聘考试教材解读小学英语
- 2025年酒店管理专业人员初级培训考试题及答案解析
- 2025年燃气储运工初级模拟题及解析
- 2025年物业管理师考试指南及模拟题解析
- 2025年电子商务网站开发面试必-备知识点与预测题解析
- 2025年压力焊工艺原理及应用面试题
- 2025年物资储备管理专家竞聘面试指南及模拟题答案
- 心电监护的并发症及预防
- 风电场知识培训课件下载
- 生态经济学-杨建州-课件专题
- 《民用无人机作业气象条件等级 植保》
- 安全伴我行-大学生安全教育知到智慧树章节测试课后答案2024年秋哈尔滨工程大学
- 《采购部相关培训》课件
- 围手术期的ERAS营养护理管理
- 2024年数据泄露一次性赔偿合同
- 有害物质过程管理系统HSPM培训教材
- 乒乓球馆合伙人协议
- 2025年蛇年年会汇报年终总结大会模板
评论
0/150
提交评论