网络课程设计.docx

上传人:b****6 文档编号:4699399 上传时间:2022-12-07 格式:DOCX 页数:22 大小:91.14KB
下载 相关 举报
网络课程设计.docx_第1页
第1页 / 共22页
网络课程设计.docx_第2页
第2页 / 共22页
网络课程设计.docx_第3页
第3页 / 共22页
网络课程设计.docx_第4页
第4页 / 共22页
网络课程设计.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

网络课程设计.docx

《网络课程设计.docx》由会员分享,可在线阅读,更多相关《网络课程设计.docx(22页珍藏版)》请在冰豆网上搜索。

网络课程设计.docx

网络课程设计

信息科学与工程学院

课程设计任务书

 

题目:

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[datasize]\n");

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1