ping工具的C语言简单实现 (ICMP echo)

这篇博客介绍了如何使用C语言在Windows和Linux平台上实现简单的ping工具,该工具基于ICMP协议的echo功能,用于检测网络连通性和测量数据包往返时间。文中提到了所需的三个源文件:icmphd.h、icmphd.c和main.c,并且指出了在不同编译环境下(MinGW-GCC和Visual Studio 2012)的编译选项。运行时需以管理员权限启动,否则可能遇到错误。
摘要由CSDN通过智能技术生成

Windows和Linux 平台下都有一个使用非常频繁的工具: ping

此工具主要是检验网络中两节点间传递的数据包是否可达,计算耗时等,其原理是使用ICMP协议发送echo,并得到目的主机的回显。

以下是实现了最基本ping 功能的C程序,一共有三个文件:

icmphd.h  —— 定义报文结构

icmphd.c ——实现其声明的函数

main.c —— 主函数入口


编译环境:

操作系统: win7 sp1

CPU :x86_64

编译器:

1) MinGW-GCC version 4.8.1 (tdm64-2)

2) Microsoft Visual Studio Ultimate 2012 version 11.0.50727.1 RTMREL

注:若使用的是MinGW-GCC,则编译时连接库: -lwsock32,否则因为编译器对函数的默认调用规则不同,无法在Windows SDK中找到

导出的符号(符号不匹配)。运行与调试时使用管理员权限,否则发送时报错,WinSock Error Code = 10013


源代码:

icmphd.h

/*
  author : ez
  date : 2014/10/20
  describe : -
*/

#ifndef _ICMPHD_H_
#	define _ICMPHD_H_

#include <stdint.h>


#	define DEF_DATA_LEN    0x10
// random number
// #	define DEF_IDENTIFY		0x0003

#pragma pack (1)

struct iphd {
	uint8_t m_cVersionAndHeaderLen;
	uint8_t m_cTypeOfService;
	uint16_t m_sTotalLenOfPacket;
	uint16_t m_sPacketID;
	uint16_t m_sSliceinfo;
	uint8_t m_cTTL;
	uint8_t m_cTypeOfProtocol;
	uint16_t m_sCheckSum;
	uint32_t m_uiSourIp;
	uint32_t m_uiDestIp;
};

struct icmphd {
	uint8_t type;
	uint8_t code;
	uint16_t chksum;
	uint16_t identifier;
	uint16_t seqnum;    // big-endian
};

struct icmppk {
	struct icmphd hd;
	uint8_t data [DEF_DATA_LEN];
};

#pragma pack ()

#	define ICMPHD_SIZE     (sizeof (struct icmphd))
#	define ICMPPK_SIZE     (sizeof (struc
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值