网络协议分析的一次实验题:ping的原理不再赘述了,直接上代码吧
注:需要ws2_32支持
下载地址:http://download.csdn.net/detail/mass_effect/9867576
#include <iostream>
#include <stdio.h>
#include <WINSOCK2.H>
#include <windows.h>
using namespace std;
//ICMP回送回应报文类型
#define ECHO_REPLY 0
//ICMP回送请求报文类型
#define ECHO_REQUEST 8
//ip首部数据结构
struct Ip_Header {
//首部长度和版本,高4位为首部长度,低4位为版本
unsigned char ip_verlen;
//服务类型/区分服务
unsigned char ip_tos;
//总长度
unsigned short ip_total_len;
//标识
unsigned short ip_id;
//标志&分片偏移 高3位为标志
unsigned short ip_fragoff;
//生存时间
unsigned char ip_ttl;
//协议
unsigned char ip_proto;
//校验和
unsigned short ip_cksum;
//源ip地址
unsigned long ip_src_IP;
//目的ip地址
unsigned long ip_dst_IP;
};
//icmp 回送请求和应答报文数据结构
struct Icmp_Header {
//类型
unsigned char icmp_type;
//代码
unsigned char icmp_code;
//校验和
unsigned short icmp_cksum;
//标识
unsigned short icmp_id;
//序列号
unsigned short icmp_seq;
//数据部分,这里使用了时间戳
unsigned long icmp_data;
};
//计算校验和,注意传入的是unsigned char数组, 所以需要两两合并才进行求和
unsigned short checkSum(unsigned char *buffer,int size){
unsigned long cksum = 0;
unsigned long tmp;
while(size>1){
//以16位为单位相加
tmp = *buffer++ << 8;
tmp += *buffer++;
cksum += tmp;
size-=sizeof(unsigned short);
}
if(size) {