网络课程设计(PING程序代码和FTP)Word下载.doc
- 文档编号:5091306
- 上传时间:2023-05-04
- 格式:DOC
- 页数:36
- 大小:370.50KB
网络课程设计(PING程序代码和FTP)Word下载.doc
《网络课程设计(PING程序代码和FTP)Word下载.doc》由会员分享,可在线阅读,更多相关《网络课程设计(PING程序代码和FTP)Word下载.doc(36页珍藏版)》请在冰点文库上搜索。
一、实验目的和要求
实验目的:
PING程序是我们使用的比较多的用于测试网络连通性的程序。
PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。
由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。
实验内容和要求:
1、RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。
为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;
2、具体内容
1.定义数据结构
需要定义好IP数据报、ICMP包等相关的数据结构;
2.程序实现
在WINDOWS环境下实现PING程序;
3.程序要求
在命令提示符下输入:
PINGΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。
不带开关变量时,要求返回4次响应。
返回信息的格式:
REPLYFROMΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
或
REQUESTTimeOut(无法PING通的情况)。
二、实验环境
Pc机一台(可以与其他机联通或者可以上网)
操作系统为windowsxp
软件为vc6.0
Windows环境下
三、实验方法、步骤及结构测试
实验按下述步骤进行:
1)熟悉IP以及ICMP协议的工作机制
2)熟悉RAW模式的SOCKET编程
3)编写PING的实现程序
4)编译环境中需要包括SOCKET库WS2_32.lib
5)在模拟实现环境下调试并运行自己编写的PING程序
6)保留你实现的程序在你的用户目录下,以备辅导教师检查
7)最后提交源程序,撰写实验报告
四、课程设计(论文)进程安排
序号
设计(论文)各阶段内容
地点
起止日期
1
了解实验内容,查找资料
实验室,
图书馆
12.22
2
查找资料,了解各个函数的内容
宿舍
12.23
3
调试,解决各段函数的错误,实现各项功能
12.24
4
小组交流,交换各自意见
12.25
5
答辩
实验室
12.26
6
完成设计报告,并加深对设计的了解
12.27
五、应收集的资料及主要参考文献
[1]程良伦,网络工程概论,机械工业出版社,2007
[2]张越等,VisualC++网络程序设计实例详解,人民邮电出版社,2006
[3]AndrewSTanenbaum著潘爱民译,计算机网络(第四版),清华大学出版社,2004
[4]谢希仁,计算机网络(第四版),电子工业大学,2006
[5]王宏.C编程设计方案教程.清华大学出版社:
2002:
[6]夏华香C#编程技巧具体案例解析.中国电力出版社:
2005:
发出任务书日期:
2008年月日指导教师签名:
计划完成日期:
2008年月日基层教学单位责任人签章:
主管院长签章:
一、ping的实现方法和方案:
1.1ping的原理:
Ping命令不仅存在Windows系统上,在Unix系统上也有Ping命令,其实对其他只要是支持网络的操作系统,一般也都存在该命令。
Ping命令的主要作用是检测网络上主机的状态。
要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。
譬如金山公司的金山网镖就可以禁止其他机器Ping通这台主机。
所以在现在的情况下,即时Ping不通某台机器,但也有可能FTP登陆到这台机器,或者通过HTTP来浏览这台机器上的Web页面
定义IP数据报、ICMP包等相关的数据结构如下:
//IP头结构
typedefstructiphdr{
unsignedinth_len:
4;
//首部长度
unsignedintversion:
//IP版本
unsignedchartos;
//服务类型
unsignedshorttotal_len;
//包总长度
unsignedshortident;
//标识符
unsignedshortfrag_and_flags;
//标志
unsignedcharttl;
//生存周期
unsignedcharproto;
//protocol(TCP,UDPetc)协议类型
unsignedshortchecksum;
//IP检验和
unsignedintsourceIP;
//源地址IP
unsignedintdestIP;
//目的地址IP
}IpHeader;
//ICMP头结构
typedefstructicmphdr{
BYTEi_type;
//类型
BYTEi_code;
//代码类型
USHORTi_cksum;
//检验和
USHORTi_id;
//地址
USHORTi_seq;
//发送顺序
/*Thisisnotthestdheader,butwereservespacefortime*/
ULONGtimestamp;
//接受时间
}IcmpHeader;
1.2设计方案:
ping[-ncount][-rcount]
-ncount
发送count指定的ECHO数据包数。
默认值为4。
-rcount
在"
记录路由"
字段中记录传出和返回数据包的路由。
count可以指定最少1台,最多9台计算机。
Ping的返回信息有"
RequestTimedOut"
、"
DestinationNetUnreachable"
和"
BadIPaddress"
还有"
Sourcequenchreceived"
。
"
这个信息表示对方主机可以到达到TIMEOUT,这种情况通常是为对方拒绝接收你发给它的数据包造成数据包丢失。
大多数的原因可能是对方装有防火墙或已下线。
这个信息表示对方主机不存在或者没有跟对方建立连接。
这里要说明一下"
destinationhostunreachable"
timeout"
的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其它原因不可到达,这时候会出现"
,如果路由表中连到达目标的路由都没有,那就会出现"
这个信息表示你可能没有连接到DNS服务器所以无法解析这个IP地址,也可能是IP地址不存在。
信息比较特殊,它出现的机率很少。
它表示对方或中途的服务器繁忙无法回应。
开始
结束
i<
argc?
if(**)
switch()
bRecordRoute=true
usage(**)
datasize=atoi(argv[i])
ipdest=argv[i]
1.3程序实现流程图如下:
r default
成立 成立
否
成立 否
否
图(ValidateArgs)
ptr/4?
If(host)?
Inaddr,h_name
inaddr
成立
不成立
成立
Iphdrlen&
&
!
icmpcount
DecodeIPoptions()
bytes<
iphdrlen+ICMP_MIN
_
Toofewbytesfrom**
I_type!
=EC*PLY
nonechotype**recvd
If(id**)
Someoneelse**
图(DecodeIPoptions)
成立
成立
成立
图(DecodeICMPHeader)
发送报文
打印失败信息结束函数
求检验和
接收报文
解析报文
设置接收和发送时限
创建套接字
创建输入接口
判断是否有IP选项
验证输入ValidateArgs()
创建一个IP选项接口
获取主机信息
填写ICMP报文
否
是
否
是
否否
是
否
否
未发送四次
完成
图(main)
二、程序源代码
主函数代码:
/主函数
//设置产生ICMP报文,增加可以选择的IP选项首部
//发送ICMP回显请求报文到目的主机,并且为每个
//报文设置一个生存时间,以防止我们不能接受到
//回显应答报文,当收到一个回显应答报文时检测代码
intmain(intargc,char**argv)
{
char*icmp_data=NULL;
//设置ICMP包数据为空
char*recvbuf=NULL;
//创建接受缓存并赋值
USHORTseq_no=0;
//设置接收顺序编号
structsockaddr_indest={'
\0'
};
//设置目的地址为空
structsockaddr_infrom={'
//设置发送地址为空
structhostent*hp=NULL;
//设置首部为空
intbread=0;
intret=0;
intfromlen=sizeof(from);
//计算发送包的长度
inttimeout=1000;
//设置生存时间
unsignedintaddr=0;
WSADATAwsaData;
//创建一个网络编程套接字
SOCKETsockRaw=INVALID_SOCKET;
//设置初始套接字为空
IpOptionHeaderipopt={'
//设置IP选项首部为空
if(WSAStartup(MAKEWORD(2,2),&
wsaData)!
=0)//判断是否成功创建版本2.2的网络套接字
{
printf("
WSAStartup()failed:
%d\n"
GetLastError());
//打印创建错误信息
return2;
}
ValidateArgs(argc,argv);
//调用验证IP选项首部函数
sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
//创建发送套接字
if(sockRaw==INVALID_SOCKET)//判断是否发送成功
WSASocket()failed:
WSAGetLastError());
//打印失败信息
return3;
if(bRecordRoute)//判断是否有记录IP路由的选项
ZeroMemory(&
ipopt,sizeof(ipopt));
//开辟一个sizeof(ipopt)长度的内存
ipopt.code=IP_RECORD_ROUTE;
//设置记录路由选项值
ipopt.ptr=4;
//指到第一个记录填写IP地址的位置
ipopt.len=39;
//IP选项首部程度
ret=setsockopt(sockRaw,IPPROTO_IP,IP_OPTIONS,(char*)&
//设置套接字选项
if(ret==SOCKET_ERROR)//判断是否成功创建套接字
{
printf("
setsockopt(IP_OPTIONS)failed:
//打印失败信息
WSAGetLastError());
}
bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,sizeof(timeout));
//设置一个接收的设置生存周期的套接字
if(bread==SOCKET_ERROR)//判断套接字是否创建成功
setsockopt(SO_RCVTIMEO)failed:
WSAGetLastError());
//打印错误信息
return-1;
timeout=1000;
bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&
//设置一个发送时限的套接字
if(bread==SOCKET_ERROR)//判断创建是否成功
setsockopt(SO_SNDTIMEO)failed:
memset(&
dest,0,sizeof(dest));
//创建一个sizeof(dest)的内存空间
dest.sin_family=AF_INET;
//设置发送主机系统的发送套接字
if((dest.sin_addr.s_addr=inet_addr(lpdest))==INADDR_NONE)//把当前地址赋值给发送地址
if((hp=gethostbyname(lpdest))!
=NULL)//gethostbyname返回一个指向hostent数据结构的指针:
memcpy(&
(dest.sin_addr),hp->
h_addr,hp->
h_length);
//创建首部长度的内存存储发送地址
dest.sin_family=hp->
h_addrtype;
//设置系统主机系统套接字
dest.sin_addr=%s\n"
inet_ntoa(dest.sin_addr));
//打印发送地址
else
gethostbyname()failed:
return-1;
//CreatetheICMPpacket
//
datasize+=sizeof(IcmpHeader);
icmp_data=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
//为icmp_data分配内存
recvbuf=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
//为recvbuf分配内存
if(!
icmp_data)//判断分配内存是否成功
HeapAlloc()failed:
memset(icmp_data,0,MAX_PACKET);
//把icmp_data内存清空
FillICMPData(icmp_data,datasize);
//调用函数填写ICMP包数据
while
(1)//用循环控制发送数量
staticintnCount=0;
//设置静态变量,记录发送报文的数量
intbwrote;
if(nCount++==4)//判断是否已经发送了4个报文,是的话退出整个循环
break;
((IcmpHeader*)icmp_data)->
i_cksum=0;
//先把ICMP的检验和置零
timestamp=GetTickCount();
//获取当前时间
i_seq=seq_no++;
//发送顺序加一
i_cksum=checksum((USHORT*)icmp_data,datasize);
//计算检验和
bwrote=sendto(sockRaw,icmp_data,datasize,0,(structsockaddr*)&
dest,sizeof(dest));
创建发送套接字
if(bwrote==SOCKET_ERROR)//判断错误
if(WSAGetLastError()==WSAETIMEDOUT)
{
printf("
timedout\n"
);
//判断超时错误
continue;
}
sendto()failed:
//判断发送失败错误
if(bwrote<
datasize)//比较发送数据报的大小
Wrote%dbytes\n"
bwrote);
//打印发送数据报的大小
bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&
from,&
fromlen);
//创建接受套接字
if(bread==SOCKET_ERROR)//判断失败原因
//判断打印超时错误
recvfrom()failed:
//判断接收失败
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 课程设计 PING 程序代码 FTP