-
课
程
设
计
课程名称
_
计算机网络
题目名称
_PING
程序设计
p>
2012
年
12
月
25
日
摘要
为了
深入理解并全面掌握
ping
命令的使用
,
以下结合
ping
程序的原理对其
功能进行了深
入探讨
.
由此可见
Internet
中的某台主机能
ping<
/p>
通并不能肯定该主机就能被访问
,
而
p>
ping
不通
也并不意味着就不能被访问<
/p>
,
同时也发现
ping
< br>命令对网络也存在一些安全隐患
.
在
Window
系统下使用
Win32
进行网络编程实现采用
WSA
通过
I
P/ICMP
进行实现
Ping
目
p>
的主机的功能。
使用
VisualStudio2008
控制台进行建立的工程,
使用
Window Socket API 2
版
本。自己定义
IP
、
IC
MP
结构体,建立目的地址和原始套接字,调用
Win32
p>
库函
数进行发
送、接收数据包。采用
ICMP
的时间截请求和回答差错报文。
本设计包
括了具体设计任务,
基本思路及所涉及的相关理论,<
/p>
设计流程图,
以及考虑到运
行中会出现的
一些异常处理。
关键词:
Window
网络编程,
Socket
,
TCP/IP
,
IC
MP
报文
目录
一、
实验目的
.
..................................................
.............
1
二、
实验内容和要求
.
< br>............................................... ..........
2
1
、
p>
RAW
模式的
SOCKET
编程
.....................
............................
3
2
、具体内容
.
.....................................
........................
3
三、
实验主要仪器设备和材料
.
...........................................
......
3
四、
实验方法及原理
.
< br>............................................... ..........
3
1.
ICMP
报文组成结构:
.....
..............................................
3
2. RAW
模式的
SOCKET
编程实现
Ping
的具体原理
..............................
4
2.
1
创建原始套接字
........
..........................................
4
1
2.2
设置套接字选项
.............................................
......
5
2.3
创建并填充相应协议头
..........................................
...
5
五、
实验流程图
.
.................................................
............
6
六、
实验具体步骤
.
................................................ ...........
6
1.
定义
IP
结构体
.
....................................
....................
7
2.
p>
定义
ICMP
结构体
.
.........................
.............................
7
3.
定义目的地址
.
..................................
.......................
7
4.
定义原始套接字
.
< br>............................................... ........
7
5.
发送数据包
.
.................................................
..........
7
6.
接收数据包
.
.................................................
..........
7
7.
解析数据包
.
.................................................
..........
8
8.
校验和的实现
.
................................................ .........
8
9.
打印相关信息
.
................................................ .........
8
10.
循环工作实现块
.
< br>............................................... .......
8
11.
信息统计
.
..................................................
..........
8
12.
相关异常处理
.
................................................ ........
9
13.
相关引用到的头文件及宏
.
...........................................
..
11
七、
实验测试结果以及使用说明
.
..........................................
...
111
八、
参考文献
.
..................................................
...........
123
九、
附录:源代码
.
................................................ .........
134
一、
实验目的
PING
< br>程序是我们使用的比较多的用于测试网络连通性的程序。
PING
程序基
于
ICMP
,使用
p>
ICMP
的回送请求和回送应答来工作。由计算机网络课程知道,<
/p>
ICMP
是基于
IP
的一个协议,
ICMP
包通过
IP
的封装之后传递。
课程设计中选取<
/p>
PING
程序的设计,其目的是希望同学们通过
< br>PING
程序的
设计,能初步掌握
TCP/IP
网络协议的基本实现方法,对网络的实现机制有进一
步的认识。
二、
实验内容和要求
2
1
、<
/p>
RAW
模式的
SOCKET
编程
PING
程序是面向
用户的应用程序,该程序使用
ICMP
的封装机制,通过
IP
协议来工作。
为了实现直接对
IP
和
ICMP
包进行操
作,
实验中使用
RAW
模式的
SOCKET
编程。
熟悉
SOCKET
的编程,包括基本的系统调用如
SOCKET
、
BIND
等
;
2
、具体内容
1)
定义数据结构
需要定义好
IP
数据报、
ICMP
包
等相关的数据结构;
2)
程序实现
在
WINDOWS
环境下实现
PING
程
序;
3)
程序要求
在命令提示符下输入:
PING
ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中
Χ
Χ
Χ
为目的主机的
IP
地址,不要求支持域名,对是否带有开关变量
也不
做要求。不带开关变量时,要求返回
4
次响应。
返回信息的格式:
REPL
Y FROM
ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
或
REQUEST TimeOut
(无法
PING
通的情况)
。
三、
实验主要仪器设备和材料
联网
Win7
操作系统计算机、
VisualSt
udio2008
Win32
控制台程序
四、
实验方法及原理
ping
的原理
:
Ping
命令
的主要作用是检测网络上主机的状态。
要是在几年前,
我们还<
/p>
可以下如此断言,如果不能
Ping
通某
台主机,那么也就无法
Telnet
或者
FTP
到这台主机,
但随着互联网的安全意识的增加,
出现了访问控制清单的路由器和防火墙,
由于
ICMP
报文
是在
IP
数据包中被传输的,而到达一台主机不仅取决于
IP
层
是否到达,
还取决于使用何种
协议和端口。譬如金山公司的金山
网镖就可以禁止其他机器
Ping
通这台主机。所以在现在
p>
的情况下,即时
Ping
不通某台机器,但
也有可能
FTP
登陆到这台机器,或者通过
HTTP
来
浏览这台机器上的
We
b
页面
报文组成结构:
在网络中
,
一般用
ICMP
来传递差错报文以及其他应注意的信息
.ICMP
一般被认为是和
IP
协议同一层的协议
,IMCP
报文通常被
IP
层或者
更高层的协议
(
如
:TCP
或者
UDP)
使
用
,ICMP
对于互联网以及其他基于
IP
p>
协议的网络的正常运行起着非常重要的作用
.
有许多重
要的网络程序都是基于
ICMP
协议上的
,
最为著名如
Ping<
/p>
和
Tracert
等
.
3
<
/p>
模式的
SOCKET
编程实现
Ping
的具体原理
<
/p>
其中
PING
程序设计使用了
RAW
模式的
SOCKET
编程,程序使用
ICMP
的
封装机制
,通过
IP
协议来工作。
2.1
创建原始套接字
要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填
充
相应协议头这三个步骤,
然后用
send
、
WSASend
函数将组装好的数据发送出去。
接收的过程也很相似,只是需要用
recv
或
p>
WSARecv
函数接收数据。
我们可以用
socket
或
WSASocket
函数来创建原始套接字,因为原始套接字
能直接控制底层协议,因此只有属于“管理员”组的成员,才有权创建原始套接
字。下
面是用
socket
函数创建原始套接字的代码。
SOCKET
sock
;
Sock
=
socket
(AF_INET, SOCK_RAW,
IPPROTO_UDP)
;
上述创
建原始套接字的代码使用的是
UDP
协议,如果要使用其它的协
议,比
如
ICMP
、
< br>IGMP
、
IP
等协议,只需要
把相应的参数改为
IPPROTO_ICM
、
< br>IPPROTO_
IGMP
、
IPPROTO_IP
就可以了。另外,
IPPROTO_UD
P
、
IPPROTO_IP
、
IPPROTO_RAW
这几个协议标志要求使用套接字选项
IP_HDRINCL
,而目前只有
Window
s
2000
和
Windows XP
提供了对
IP_HDRINCL
的支持
,这意味着在
Windows 2000
以下平台
创建原始套接字时是不能使用
IP
、
UDP
、
TCP
协议的。
p>
2.2
设置套接字选项
创建了原始套接字后,就要设置套接字选项,这要通过
setsocketo
pt
函数
来实现,
setsocket
opt
函数的声明如下:
int setsocketopt (
SOCKET s,
int level,
int optname,
const char FAR *optval,
int
optlen
);
4
在该声明中,参数
s
是标识套接口的描述字,要注意的是选项对这个套接字
必须是有效的。参数
Level
表明选项定义的层次,对<
/p>
TCP/IP
协议族而言,支持
SOL_
SOCKET
、
IPPROTO_IP
和
IPPROTO_CP
层次。参数
O
ptname
是需要设置的选项
名,
这
些选项名是在
Winsock
头文件内定义的常数值。
参数
optval
是一个指针,
它指向存放选项值的缓冲区。参数
optlen
指示<
/p>
optval
缓冲区的长度
2.3
创建并填充相应协议头
这一步就是创建
IP
和
TCP
协议头的数据结构,
根据相关协议的定义进行编
写即可,下面是一个
TCP
协议头的数据结构。
发送接收数据包的实现原理
:
Sendto()-
使用指定的
So
cketFlags
,将指定字节数的数据发送到指定的终
结点
。
适用于已连接的数据报或流式套接口发送数据。
对于数据报类
套接口,
必
需注意发送数据长度不应超过通讯子网的
IP
包最大长度。
IP
包
最大长度在
WSAStartup()
调用返回的
WSAData
的
iMaxUdpDg
元素中。
如果数据太长无法自动
通过下层协议,
p>
则返回
WSAEMSGSIZE
错误,
p>
数据不会被发送。
请注意成功地完成
sen
dto()
调用并不意味着数据传送到达。
endto()
p>
函数主要用于
SOCK_DGRAM
类型<
/p>
套接口向
to
参数指定端的套接口发送数
据报。对于
SOCK_STREAM
类型套接口,
to
和
tolen
参数被忽
略;这种情况下
sendto()
等价于
send()
。为了发送广播数
据
(
仅
适
用
于
p>
SOCK_DGRAM
)
,
in
参
数
所
< br>含
地
址
应
该
把
特
定
的
IP
地
址
IN
ADDR_BROADCAST
(
winsock.h
中有定义)和终端地址结合起来构造。通常建议
一个广播数据报的大小不
要大到以致产生碎片,
也就是说数据报的数据部分
(包
括头)
不超过
512
字
节。
如果传送系统的缓冲区空间不够保存需传送的数据,
除
p>
非套接口处于非阻塞
I/O
方式,
否则
sendto()
将阻塞。
对于非阻塞
SOCK_STREAM
类型的套接口,<
/p>
实际写的数据数目可能在
1
到所需大小之
间,
其值取决于本地和
远端主机的缓冲区大小。可用
select()
调用来确定何时能够进一步发送数据。
< br>
Recvfrom()-
接收一个数据报并保存源地址
。
对于
SOCK_STREAM
p>
类型的套接
口,
最多可接收缓冲区大小个数
据。
如果套接口被设置为线内接收带外数据
(选
项为
SO_OOBINLINE
),且有带外数据未读
入,则返回带外数据。应用程序可通
过调用
ioctlsock
et()
的
SOCATMARK
命令来
确定是否有带外数据待读入。对于
SOCK_STREAM
类型
套接口,忽略
from
和
fromle
n
参数。对于数据报类套接口,
队列中第一个数据报中的数据被
解包,
但最多不超过缓冲区的大小。
如果数据报
大于缓冲区,
那么缓冲区中只有数据报的前面部分,
其
他的数据都丢失了,
并且
recvfrom()
函数返回
WSAEMSGSIZE
错误。若
from
非零,且套接口为
SOCK_DGRAM
类型,则发送数据源的地址被复制到相应的
sockaddr<
/p>
结构中。
fromlen
所指向
的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修
改。
如果没有数据待读,
那么除非是非阻塞模式,
不然的话套接口将一直等待数
5
据的到来,此时将返回
SOCKET
_ERROR
错误,错误代码是
WSAEWOULDBLOCK
。用
select()
或
WSAAsynSelect()
可
以
获
知
何
时
< br>数
据
到
达
。
如
果
套
接
口
为
SOCK_STREAM
类型,
并且远端“优雅”地中止了连接,
那么<
/p>
recvfrom()
一个数据
也不读取
,立即返回。如果立即被强制中止,那么
recv()
将以
p>
WSAECONNRESET
错误失败返回。
五、
实验流程图
--
另付图
六、
实验具体步骤
1.
定义
IP
结构体
//IP
格式
typedef
struct
iph{
UCHAR
iph_VerLen;
//
版本
-4byte
UCHAR
ip_TOS;
//
p>
区分服务
-8byte
USHORT
ip_Length;
//
首部长度
-4byte
USHORT
ip_ID;
//
p>
标识
-16byte
USHORT
ip_Flags;
/
/
标志
-3byte
UCHAR
ip_TTL;
//<
/p>
生存数据(数据报在网络上的存活时间,每通过一个路
//
由器,该数值减一
UCHAR
ip_Protacol;
//
协议(
TCP/IP
协议类型
,比如:
ICMP
为,
IGMP
为,
TCP
为,
UD
P
为等)
USHORT
ip_Checksum;
//
头部检验和
ULONGip_Source;
//
源
IP
地址
ULONGip_Destination;
//
目的
IP
地址
}IPHDR;
p>
2.
定义
ICMP
结构体
//ICMP
格式
typedef
struct
icmph{
unsigned
char
icmp_Type;
//
类型
-8byte
unsigned
char
icmp_Code;
//
代码
-16byte
unsigned
short
icmp_Checksum;
< br>//
检验和
-16byte
unsigned
short
icmp_Id;
//
识别号
6
-
-
-
-
-
-
-
-
-
上一篇:离网型光伏发电系统实验报告
下一篇:同弧所对的圆周角均相等(几何证明)