网络课程设计.docx
- 文档编号:4699399
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:22
- 大小:91.14KB
网络课程设计.docx
《网络课程设计.docx》由会员分享,可在线阅读,更多相关《网络课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
网络课程设计
信息科学与工程学院
课程设计任务书
题目:
PING程序设计与实现
学号:
姓名:
专业:
课程:
计算机网络
指导教师:
职称:
完成时间:
2012年5月----2012年6月
信息科学与工程学院制
2012年6月24日
课程设计任务书及成绩评定
课程设计的任务和具体要求
课程设计任务:
PING程序用于测试网络连通性的程序。
通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。
了解网络编程,对计算机网络有进一步的认识。
课程设计具体要求:
(1)熟悉原始套接字编程;
(2)了解网络的结够;
(3)了解网络的底层传输协议;
(4)在Windows下实现Ping程序;
指导教师签字:
、日期:
指导教师评语
成绩:
指导教师签字:
日期:
课程设计所需软件、硬件等
所需软件:
VC++6.0、Word2010
所需硬件:
PC机
课程设计进度计划
起至日期
工作内容
备注
2012.6.16—2012.6.18
2012.6.18—2012.6.20
2012.6.21—2012.6.24
搜集资料、准备课程设计
编写代码、实现ping程序
撰写课程设计的实验报告
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
1计算机网络(第五版)谢希仁电子工业出版社
2计算机网络(第四版)雷震甲西安科技出版社
3计算机网络(第四版)特南鲍姆清华大学出版社
4VC++程序设计项目实践贾振华清华大学出版社
目录
一、设计原理…………………….………….……………………………………4
1.1工作原理…………………..………….……………………………………4
1.2网络编程………………..………….……………………………………4
二、功能模块设计………………..………….……………………………………5
2.1功能模块……………………..……………………………………………5
2.2系统流程………………….….……………………………………………5
三、函数功能描述……………….….…………….………………………………7
3.1初始化函数……………….….…………….………………………………7
3.2功能函数………………….……….……….………………………………7
3.3主函数…………………….………….……….……………………………7
四、程序实现……………………….……….……………………………………8
4.1程序预处理及初始………..……………………………………………8
4.2功能控制模块………….………………………………………………10
4.3数据报解读模块….……………………………………………………12
4.4功能测试….…………………………………………………………13
五、运行结果……………………………………………………………………16
六、总结…………….……………………………………………………………17
一.设计原理:
1、PING的工作原理
ping程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。
ping使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。
ICMP协议规定:
目的主机必须返回ICMP回送应答消息给源主机。
如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。
因此,保证数据送达的工作应该由其他的模块来完成。
其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。
给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。
而前16bit就组成了ICMP所要传递的信息。
PING利用ICMP协议包来侦测另一个主机是否可达。
原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。
用户就可以判断网络大致的情况。
2、RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。
为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等.
3、具体内容
(1) 定义数据结构
需要定义好IP数据报、ICMP包等相关的数据结构
(2) 程序实现
在WINDOWS环境下实现PING程序
二、功能模块设计
1.功能模块图
本系统共有4个模块,分别是初始化模块、功能控制模块、数据控制模块、数据报解读模块和ping测试模块,如图9.1所示。
各模块功能描述如下。
(1)初始化模块。
改模块用于初始化各个全局变量,为全局变量赋初始值;初始化,加载库。
(2)功能控制模块。
改模块是被其它模块调用,其功能包括获取参数、计算校验和填充数据报文、释放占用资源和显示用户帮助。
(3)数据报解读模块。
改模块用于解读接收到的报文和选项。
(4)测试模块。
改模块是本程序的核心模块,调用其他模块实现其功能,主要是实现的功能。
2.系统流程图
系统执行的流程图9.2所示。
程序首先调用IniPing()函数初始化各全局变量,然后GetArgments()函数获取用户输入的参数,检查用户输入的参数,如果参数不正确或者没有输入参数,则显示用户帮助信息(Userhelp),并结束程序;如果参数正确,则对指定目的地执行Ping命令,如果Ping通,则显示Ping结果并释放占用资源,如果没有Ping通,则报告错误信息,并释放占用资源。
3、函数功能描述
1.初始化函数
IntPing()
函数原型:
voidIntPing()
IntPing()函数用于初始化ping所需的全局变量,为各个变量赋初始值。
userHelp()
函数原型:
voiduserHelp()
userHelp()函数用于显示用户帮助信息。
GetArgments()
函数原型:
voidGetArgments(intargc,char**argv)
GetArgments()函数用于获取用户提交的参数。
checkSum()
函数原型:
USHORTcheckSum(USHORT*buffer,intsize)
checkSum()函数用于计算校验和。
2.功能函数
FillCMPData()
函数原型:
voidFillCMPData()
FillCMPData()函数用于填充ICMP数据报中各个字段。
reeRes()
函数原型:
voidreeRes()
reeRes()函数用于释放占用的资源,包括关闭初始化socket调用的函数的、关闭创建的socket和释放分配的内存等。
DecodeIPOptions()
函数原型:
voidDecodeIPOptions()
DecodeIPOptions()函数用于解读IP选项。
DecodelICMPHeader()
原型:
voidDecodelICMPHeader(char*buf,intbytes,SOCKADDR_IN*from)
DecodelICMPHeader()函数用于解读ICMP报文信息。
3.ping函数
PingTest()
函数原型:
voidPingTest(inttimeout)
PingTest()函数用于进行Ping操作。
其中timeout表示设定的发送超时值。
四、程序实现
1.程序预处理
/*导入库文件*/
#pragmacomment(lib,"ws2_32.lib")
/*加载头文件*/
#include
#include
#include
#include
#include
#defineIP_RECORD_ROUTE0x7
/*默认数据报大小*/
#defineDEF_PACKET_SIZE32
/*最大的ICMP数据报大小*/
#defineMAX_PACKET1024
/*最大IP头长度*/
#defineMAX_IP_HDR_SIZE60
/*ICMP报文类型,回显请求*/
#defineICMP_ECHO8
/*ICMP报文类型,回显应答*/
#defineICMP_ECHOREPLY0
/*最小的ICMP数据报大小*/
#defineICMP_MIN8
voidInitPing();
voidUserHelp();
voidGetArgments(intargc,char**argv);
USHORTCheckSum(USHORT*buffer,intsize);
voidFillICMPData(char*icmp_data,intdatasize);
voidFreeRes();
voidDecodeIPOptions(char*buf,intbytes);
voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from);
voidPingTest(inttimeout)
typedefstruct_iphdr
{
unsignedinth_len:
4;/*IP报头长度*/
unsignedintversion:
4;/*IP的版本号*/
unsignedchartos;/*服务的类型*/
unsignedshorttotal_len;/*数据报总长度*/
unsignedshortident;/*惟一的标识符*/
unsignedshortfrag_flags;/*分段标志*/
unsignedcharttl;/*生存期*/
unsignedcharproto;/*协议类型(TCP、UDP等)*/
unsignedshortchecksum;/*校验和*/
unsignedintsourceIP;/*源IP地址*/
unsignedintdestIP;/*目的IP地址*/
}IpHeader;
typedefstruct_icmphdr
{
BYTEi_type;/*ICMP报文类型*/
BYTEi_code;/*该类型中的代码号*/
USHORTi_cksum;/*校验和*/
USHORTi_id;/*惟一的标识符*/
USHORTi_seq;/*序列号*/
ULONGtimestamp;/*时间戳*/
}IcmpHeader;
typedefstruct_ipoptionhdr
{
unsignedcharcode;/*选项类型*/
unsignedcharlen;/*选项头长度*/
unsignedcharptr;/*地址偏移长度*/
unsignedlongaddr[9];/*记录的IP地址列表*/
}IpOptionHeader;
SOCKETm_socket;
IpOptionHeaderIpOption;
SOCKADDR_INDestAddr;
SOCKADDR_INSourceAddr;
char*icmp_data;
char*recvbuf;
USHORTseq_no;
char*lpdest;
intdatasize;
BOOLRecordFlag;
doublePacketNum;
BOOLSucessFlag;
初始化模块
/*初始化变量函数*/
voidInitPing()
{WSADATAwsaData;
icmp_data=NULL;
seq_no=0;
recvbuf=NULL;
RecordFlag=FALSE;
lpdest=NULL;
datasize=DEF_PACKET_SIZE;
PacketNum=5;
SucessFlag=FALSE;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{printf("WSAStartup()failed:
%d\n",GetLastError());
return;
}
m_socket=INVALID_SOCKET;
}
2.功能控制模块
/*显示信息函数*/
voidUserHelp()
{printf("UserHelp:
ping-r
printf("-rrecordroute\n");
printf("-nrecordamount\n");
printf("hostremotemachinetoping\n");
printf("datasizecanbeupto1KB\n");
ExitProcess(-1);
}
voidGetArgments(intargc,char**argv)
{inti;
intj;
intexp;
intlen;
intm;
if(argc==1)
{printf("\nPleasespecifythedestinationIPaddressandthepingoptionasfollow!
\n");
UserHelp();
}
for(i=1;i {len=strlen(argv[i]); if(argv[i][0]=='-') {if(isdigit(argv[i][1])) {PacketNum=0; for(j=len-1,exp=0;j>=1;j--,exp++) PacketNum+=((double)(argv[i][j]-48))*pow(10,exp); } else{ switch(tolower(argv[i][1])) { case'r': RecordFlag=TRUE; break; default: UserHelp(); break; } } } elseif(isdigit(argv[i][0])){ for(m=1;m if(! (isdigit(argv[i][m]))) { lpdest=argv[i]; break; } elseif(m==len-1) datasize=atoi(argv[i]); } } else lpdest=argv[i]; } } USHORTCheckSum(USHORT*buffer,intsize) {unsignedlongcksum=0; while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR*)buffer; } /*对每个16bit进行二进制反码求和*/ cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return(USHORT)(~cksum); } voidFillICMPData(char*icmp_data,intdatasize) { IcmpHeader*icmp_hdr=NULL; char*datapart=NULL; icmp_hdr=(IcmpHeader*)icmp_data; icmp_hdr->i_type=ICMP_ECHO; icmp_hdr->i_code=0; icmp_hdr->i_id=(USHORT)GetCurrentProcessId(); icmp_hdr->i_cksum=0; icmp_hdr->i_seq=0; datapart=icmp_data+sizeof(IcmpHeader); memset(datapart,'0',datasize-sizeof(IcmpHeader)); } voidFreeRes() { if(m_socket! =INVALID_SOCKET) closesocket(m_socket); HeapFree(GetProcessHeap(),0,recvbuf); HeapFree(GetProcessHeap(),0,icmp_data); WSACleanup(); return; } 3.数据报解读模块 /*解读IP选项头函数*/ voidDecodeIPOptions(char*buf,intbytes) { IpOptionHeader*ipopt=NULL; IN_ADDRinaddr; inti; HOSTENT*host=NULL; ipopt=(IpOptionHeader*)(buf+20); printf("RR: "); for(i=0;i<(ipopt->ptr/4)-1;i++){ inaddr.S_un.S_addr=ipopt->addr[i]; if(i! =0) printf(""); host=gethostbyaddr((char*)&inaddr.S_un.S_addr,sizeof(inaddr.S_un.S_addr),AF_INET); if(host) printf("(%-15s)%s\n",inet_ntoa(inaddr),host->h_name); else printf("(%-15s)\n",inet_ntoa(inaddr)); } return; } voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from) { IpHeader*iphdr=NULL; IcmpHeader*icmphdr=NULL; unsignedshortiphdrlen; DWORDtick; staticinticmpcount=0; iphdr=(IpHeader*)buf; iphdrlen=iphdr->h_len*4; tick=GetTickCount(); if((iphdrlen==MAX_IP_HDR_SIZE)&&(! icmpcount)) DecodeIPOptions(buf,bytes); if(bytes printf("Toofewbytesfrom%s\n", inet_ntoa(from->sin_addr)); } icmphdr=(IcmpHeader*)(buf+iphdrlen); if(icmphdr->i_type! =ICMP_ECHOREPLY){ printf("nonechotype%drecvd\n",icmphdr->i_type); return; } if(icmphdr->i_id! =(USHORT)GetCurrentProcessId()){ printf("someoneelse'spacket! \n"); return; } SucessFlag=TRUE; printf("%dbytesfrom%s: ",bytes,inet_ntoa(from->sin_addr)); printf("icmp_seq=%d.",icmphdr->i_seq); printf("time: %dms",tick-icmphdr->timestamp); printf("\n"); icmpcount++; return; } 4.Ping测试模块 /*ping函数*/ voidPingTest(inttimeout) { intret; intreadNum; intfromlen; structhostent*hp=NULL; m_socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(m_socket==INVALID_SOCKET) { printf("WSASocket()failed: %d\n",WSAGetLastError()); return; } if(RecordFlag) { ZeroMemory(&IpOption,sizeof(IpOption)); /*为每个ICMP包设置路由选项*/ IpOption.code=IP_RECORD_ROUTE; IpOption.ptr=4; IpOption.len=39; ret=setsockopt(m_socket,IPPROTO_IP,IP_OPTIONS,(char*)&IpOption,sizeof(IpOption)); if(ret==SOCKET_ERROR){ printf("setsockopt(IP_OPTIONS)failed: %d\n",WSAGetLastError()); } } readNum=setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(read
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)