用C语言实现Ping程序功能

大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。

ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。

例如,在Linux终端上执行ping localhost命令将会看到以下结果:

PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=112 usec
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=255 time=79 usec
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=255 time=78 usec
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=255 time=82 usec
--- localhost.localdomain ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.078/0.087/0.112/0.018 ms

由上面的执行结果可以看到,ping命令执行后显示出被测试系统主机名和相应IP地址、返回给当前主机的ICMP报文顺序号、ttl生存时间和往返时间rtt(单位是毫秒,即千分之一秒)。要写一个模拟ping命令,这些信息有启示作用。

要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议。

ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方。ICMP协议是IP层的一个协议,但是由于差错报告在发送给报文源发方时可能也要经过若干子网,因此牵涉到路由选择等问题,所以ICMP报文需通过IP协议来发送。ICMP数据报的数据发送前需要两级封装:首先添加ICMP报头形成ICMP报文,再添加IP报头形成IP数据报。如下图所示

IP报头
ICMP报头
ICMP数据报

IP报头格式

由于IP层协议是一种点对点的协议,而非端对端的协议,它提供无连接的数据报服务,没有端口的概念,因此很少使用bind()和connect()函数,若有使用也只是用于设置IP地址。发送数据使用sendto()函数,接收数据使用recvfrom()函数。IP报头格式如下图:

时间: 2024-12-22 13:47:21

用C语言实现Ping程序功能的相关文章

代码-用java语言编写android程序,实现调用usb打印机图片功能

问题描述 用java语言编写android程序,实现调用usb打印机图片功能 用java语言编写android程序,实现调用usb打印机图片功能,打印机不能联网,只是用代码去调用usb接口的打印机.急需实现此功能,请大神们帮帮忙 解决方案 http://blog.csdn.net/kangear/article/details/18141741 解决方案二: http://www.360doc.com/content/13/0906/12/11482448_312596809.shtml

C++实现ping程序实例_C 语言

本文实例讲述了C++实现ping程序的方法.分享给大家供大家参考.具体实现方法如下: 该实例涉及ICMP数据包的发送与回显,PING程序代码如下: 复制代码 代码如下: DWORD WINAPI ThreadProc(LPVOID lParam) {  CInitSock initSock;    HWND hWnd = (HWND)lParam; //从参数得到句柄  char szIp[64] ={0};  ::GetDlgItemTextA(hWnd, IDC_IP, szIp, size

设计-学生在线答疑排队模拟C语言版的程序代码有木有呢?

问题描述 学生在线答疑排队模拟C语言版的程序代码有木有呢? 程序设计思路: 1.主函数main( ),打印输出主控程序菜单选项,并接收用户的选择项 2.定义学生信息(学号.姓名)的数据存储结构 3.设计学生在线答疑排队模拟程序的功能函数EnQueue( ),处理新学生加入排队的情况 4.设计学生在线答疑排队模拟程序的功能函数AnsQ( ),处理队列中第一个学生出队列答疑的情况 5.设计功能函数PrintQ( ),输出队列中所有正在排队的学生信息. 6.当用户退出答疑程序时,检查队列是否为空.如仍

c语言-C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单?

问题描述 C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单? 我的程序运行完一个功能后按任意键就退出了,而不是返回主菜单 代码如下,应该怎么改?(具体一点,菜鸟一个)多谢! #include #include #include #include #include #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[11]; char style[15]; c

用BASIC语言写智能手机程序

前言 时下,智能手机越来越贴近我们的生活,越来越多的教师朋友,学生朋友都会用智能手 机,因为她们功能齐全,在手机上运行的软件应有尽有,QQ.在线游戏,音乐影视--.. 对于大学生朋友,广大教师朋友,能够在自己的手机有一个动态的课程表程序,一来可以合理安 排空余时间,二来又不会误了学习工作的时间,是一件非常不错的事.本文,以微软公司的移动手机 平台 WindowsMobile2003为基础,简单实现手机上的课表程序. 程序在 WindowsMobile2003 dopod818手机上测试通过.程序

c语言-急!!求大神能帮忙注释一个C语言编译器的程序。大概说一下程序的流程和框架。

问题描述 急!!求大神能帮忙注释一个C语言编译器的程序.大概说一下程序的流程和框架. 谢谢!灰常感谢~~~~留邮箱发代码~~~~程序目的是完成词法分析.语法分析.语义分析等功能,并生成某种机器上的目标代码(汇编语言)或中间代码(四元式). 解决方案 不懂-程序目的是完成词法分析.语法分析.语义分析等功能, 解决方案二: 363581806@qq.com 尽量试试,刚刚做完编译原理实验,应该能看懂一点-- 解决方案三: 906254242@qq.com我来.

编程-C语言,这个程序是什么意思呀?

问题描述 C语言,这个程序是什么意思呀? 解决方案 感觉p[head]=p[head]这句可以忽视,自己等于自己啊?说一下我的看法:首先是给数组赋值,除了p[16]每个数的值都等于他的下标加一,这样在循环里是每两个一循环,head记录下标test记录下标的数值,test就是1,2;3,4;5,6;7,8;9,10;11,12;13,14;15,0,然后又重新开始了一个新的循环,这是我的看法,楼主加油! 解决方案二: 你这个程序没有输出的,一直在while中. 解决方案三: 感觉这个程序无用,一直

使用C语言扩展Python程序的简单入门指引_python

一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能.执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人

《C语言及程序设计》实践参考——处理C语言源代码的程序

返回:贺老师课程教学链接 [项目3 - 处理C语言源代码的程序] 用C语言写的源程序是一种文本文件.本项目将以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数.将某些行加上注释等.各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将其集成在一起(向着自己做出IDE努力). (1)读入一个C++程序,判断其中是否只有一个main()函数,输出"暂时没有发现问题",或者"没有main()函数",或者"不能定义多个main