![](https://csdnimg.cn/release/download_crawler_static/88584443/bg3.jpg)
unsigned char ip_hl:4; #IP 数据报的报文长度
unsigned char ip_v:4; #IP 数据报的版本号
unsigned char ip_tos; #IP 数据报的区分服务
unsigned short ip_len; #IP 数据报的总长度
unsigned short ip_id; #IP 数据报的标识
unsigned short ip_off; #IP 数据报的标志
unsigned char ip_ttl; #IP 数据报的生存时间
unsigned char ip_p; #IP 数据报的协议号
unsigned short ip_sum; #IP 数据报的首部校验和
unsigned long ip_src; #IP 数据报的源地址
unsigned long ip_dst; #IP 数据报的目的 IP 地址
};
#定义全局变量和函数
unsigned char sendpacket[PACKET_SIZE]; #待发送的数据报文
unsigned char recvpacket[PACKET_SIZE]; #待接收的数据报文
struct sockaddr_in dest_addr; #套接网络地址目的地址
struct sockaddr_in from_addr; #套接网络地址端口地址
int sockfd; #socket 状态变量
int pid; #程序标志位,取得进程识别码,在 process.h 下
unsigned short cal_chksum(unsigned short *addr,int len); #实现对 ICMP 包的检
查并返回有效字符
int pack(int pack_no); #对包进行封装
int unpack(unsigned char *buf,int len); #对 IP 数据包有效字节数据进行存储,实
现对数据基于 ICMP 包上再进行封装,并实现数据字节调用输出。
bool send_packet(void); #是否发送包
bool recv_packet(void); #是否接收包
#定义 main()函数及检测命令行参数
int main(int argc,char *argv[])
{
struct protoent *protocol;
WSADATA wsaData; #建立 WSADATA 结构体,用于存储被 WSAStartup 函数调用后返
回的 Windows sockets 初始化数据
int timeout=1000; #超时时间为 1000 毫秒
int SEND_COUNT=4; #发送计数器
char *par_host; #初始化
par_host=argv[argc-1]; #获取主机 IP
if(argc < 2)
{
printf("usage: %s [-t] Host name or IP address\n",argv[0]); #输入参数数
量小于 2
exit(1);
}