网络课程设计(PING程序代码和FTP)Word下载.doc

上传人:wj 文档编号:5091306 上传时间:2023-05-04 格式:DOC 页数:36 大小:370.50KB
下载 相关 举报
网络课程设计(PING程序代码和FTP)Word下载.doc_第1页
第1页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第2页
第2页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第3页
第3页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第4页
第4页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第5页
第5页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第6页
第6页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第7页
第7页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第8页
第8页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第9页
第9页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第10页
第10页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第11页
第11页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第12页
第12页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第13页
第13页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第14页
第14页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第15页
第15页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第16页
第16页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第17页
第17页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第18页
第18页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第19页
第19页 / 共36页
网络课程设计(PING程序代码和FTP)Word下载.doc_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

网络课程设计(PING程序代码和FTP)Word下载.doc

《网络课程设计(PING程序代码和FTP)Word下载.doc》由会员分享,可在线阅读,更多相关《网络课程设计(PING程序代码和FTP)Word下载.doc(36页珍藏版)》请在冰点文库上搜索。

网络课程设计(PING程序代码和FTP)Word下载.doc

一、实验目的和要求

实验目的:

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:

//判断接收失败

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2