c语言实现ping程序

基础知识

1、ICMP协议
互联网控制信息协议(Internet CONTROLM essage Protocol),用于错误报告和调试。该协议是TCP/IP 协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP 数据无法访问目标、IP 路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。我们可以通过Ping 命令发送ICMP回应请求消息并记录收到ICMP回应回复消息,通过这些消息来对网络或主机的故障提供参考依据。常见ICMP报文有响应请求报文,目标不可到达、源抑制和超时报文,此外还有时间戳报文。

2、Ping 工作原理
Ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容:发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数;回送的时候包括双方地址,还有时间等,主要是接受方在都是在操作系统内核里做好的,时刻在监听。Ping程序生成一个icmp“回送请求”,将其发送给目的主机。通过检测是否可以收到目标主机的应答,便可以知道网络的连通性。

3.ICMP报文格式

4.IP报文格式

5、WinSock原始套接字的使用方法与API
函数Winsock 原始套接字编程过程中,服务器端/ 客户端的编程都按照以下步骤:
初始化套接字(WSAStartup)
创建套接字(socket 或WSASocket)
向服务器通信(sendto/recvfrom)
关闭套接字(closesocket)
结束使用套接字(WSACleanup)

6、三种WinSock地址结构
① 用的Winsock 地址结构sockaddr ,针对各种通信域的套接字,存储它们的地址信息。
② 专门针对Internet 通信域的Winsock 地址结构sockaddr_in
③ 专用于存储IP 地址的结构in_addr

7、编程时,需要用到一些windows 函数,说明如下:
(1)int WSAStartup(WORD wVersionRequested,LPWSADA TA lpWSAData);
函数说明:为了在应用程序当中调用任何一个Winsock API 函数,首先第一件事情就是必须通过WSAStartup 函数完成对Winsock 服务的初始化, 因此需要调用WSAStartup 函数。使用Socket的程序在使用Socket 之前必须调用WSAStartup 函数。该函数的第一个参数指明程序请求使用的Socket 版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket 的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket 版本来搜索相应的Socket 库,然后绑定找到的Socket 库到该应用程序中。以后应用程序就可以调用所请求的Socket 库中的其它Socket 函数了。
(2)SOCKET socket( int af, int type, int protocol );
函数说明:应用程序调用socket 函数来创建一个能够进行网络通信的套接字。
第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP 协议族,该参数置AF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM 、数据报套接字类型为SOCK_DGRAM 、原始套接字SOCK_RAW接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);第三个参数指定应用程序所使用的通信协议。
(3).int sendto( SOCKET s, const char FAR *buf, int len,int flags, const struct sockaddr FAR *to, int tolen);
函数说明:
返回值:实际发送数据的长度。
parameter s 套接字
buff 待发送数据的缓冲区size 缓冲区长度
Flags 调用方式标志位, 一般为0, 改变Flags,将会改变Sendto 发送的形式
Addr 指针,指向目的套接字的地址
Len addr 所指地址的长度
(4)int recvfrom(SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR *from, int FAR *fromlen );
函数说明:recvfrom( )用来接收远程主机经指定的socket 传来的数据,并把数据传到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度.参flags 一般设0,其他数值定义参考recv(). 参数from 用来指定欲传送的网络地址,结构sockaddr 请参考bind() 函数.参数fromlen 为sockaddr 的结构长度.

算法设计

要实现ping 程序,需要实现以下步骤:
(1) 创建协议类型为IPPROTO_ICMP 的原始套接字,设置套接字属性。
(2) 创建并初始化ICMP 封包。
(3) 调用sendto 函数向远程主机发送ICMP 请求。
(4) 调用recfrom 函数接受ICMP 响应。
Ping程序的设计与实现大致可分为四个模块,分别是:初始化模块、功能控制模块、ping 模块、mian 测试模块。

1.初始化模块:该模块用于定义及初始化各个全局变量,为winsock加载winsock 体。主要包括定义IP 首部格式、定义ICMP首部格式、定义ICMP回应请求、定义ICMP回应答复。
这里写图片描述
2.功能控制模块: 该模块是被其他模块调用,其功能包括计算校验和、发送回应请求函数、接收应答回复并进行解析、等待回应答复。
计算校验和
这里写图片描述
发送请求
这里写图片描述
接收应答回复并进行解析
这里写图片描述
等待回应答复
这里写图片描述
3.Ping 模块功能模块 该模块是本程序的核心模块,调用其他模块实现其功
能,进而实现Ping 的功能。
这里写图片描述
4.main()函数模块&#x

  • 21
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值