以下是阅读解释的部分 不知道对不对请各位大侠多多帮忙指点指点不对的地方请帮忙改并加以说明原因谢谢 可能有点乱 应为用word软件改过的
#include <STDIO.H>//
#include <WINSOCK2.H>
//
//IP报头结构
//
typedef struct _iphdr
{
unsigned int h_len:4;//4位首部长度:指IP报头结构体的总字节长度:该域长度为4个字节(32位),一个IP报头最大长度是4*15=60个字节数,在没有可选域时IP报头长度是20个字节,所以通常值赋予5, 4*5=20(个字节) h_len=sizeof(IpHeader) 注释:《TCP_IP网络实验程序篇的51页》
unsigned int version:4;//4位IP版本号:指IP是属于那个版本的,(目前流行的是IPV4,版本4)(还有个版本是IPV6,版本6) version=4或version=6;
unsigned char tos;//8位服务类型TOS:指在发送IP数据报时,为了向路由器表示服务的质量所使用的域 ?
unsigned short total_len;//16位总长度(字节):是IP数据报和其它协议报在一起的长度,称为包的总长度 total_len=sizeof(IpHeader)+上一层协议的报头结构体;
unsigned short ident;//16位标识:通常用进程(ID)号和线程(ID)号来表示这个值ident=GetCurrentProcessId或是ident=ident=GetCurrentProcessId
unsigned short frag_and_flags;//3位标志位:?
unsigned char ttl;//8位生存时间 TTL:指是IP数据报能通过多少个路由器,每通过一个路由器TTL值就减去1,直到TTL为零时,路由器就会丢弃这个IP报 ?
unsigned char proto;//8位协议 (TCP, UDP 或其他):指的是上一层的协议(可以是TCP,UCP,ICMP,等协议)
unsigned short checksum;//16位IP首部校验和:检查报头的好坏
unsigned int sourceIP;//32位源IP地址:自己主机的地址
unsigned int destIP;//32位目的IP地址:对方主机的地址
}IpHeader;
//
//ICMP报头结构
//
typedef struct _icmphdr
{
BYTE i_type;//8位类型:指控制报文的消息类型 如:响应—请求消息类值是8,i_type=8;
BYTE i_code;//8位代码 编码:值赋为0,i_code=0;
USHORT i_cksum;//16位校验和:指检查数据报的好坏
USHORT i_id;//识别号(一般用进程号作为识别号):通常用进程(ID)号和线程(ID)号来表示这个值 i_id=GetCurrentProcessId或是 i_id =ident=GetCurrentProcessId
USHORT i_seq;//报文序列号:记录发送端发送的是第几号包,包的编码
ULONG timestamp;//时间戳 ?
}icmpHeader;
//
//计算效验和
//
unsigned short shecksum(unsigned short *buff,int size)
{
u_long cksum=0;
//将数据累加到cksum变量中
while(size>1)
{
cksum+=*buff++;
size-=sizeof(USHORT);
}
//将cksum的高16位和低16位相加,取反后得到效验和
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return (USHORT)(~cksum);
}
int main()
{
USHORT seq_no=0;//用于累加序列号,用于记录icmp包的编码
//加载库版本信息
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);//调用函数WSAStartup加载库版本信息,第几个版本
//创建原始套接字
#include <STDIO.H>//
#include <WINSOCK2.H>
//
//IP报头结构
//
typedef struct _iphdr
{
unsigned int h_len:4;//4位首部长度:指IP报头结构体的总字节长度:该域长度为4个字节(32位),一个IP报头最大长度是4*15=60个字节数,在没有可选域时IP报头长度是20个字节,所以通常值赋予5, 4*5=20(个字节) h_len=sizeof(IpHeader) 注释:《TCP_IP网络实验程序篇的51页》
unsigned int version:4;//4位IP版本号:指IP是属于那个版本的,(目前流行的是IPV4,版本4)(还有个版本是IPV6,版本6) version=4或version=6;
unsigned char tos;//8位服务类型TOS:指在发送IP数据报时,为了向路由器表示服务的质量所使用的域 ?
unsigned short total_len;//16位总长度(字节):是IP数据报和其它协议报在一起的长度,称为包的总长度 total_len=sizeof(IpHeader)+上一层协议的报头结构体;
unsigned short ident;//16位标识:通常用进程(ID)号和线程(ID)号来表示这个值ident=GetCurrentProcessId或是ident=ident=GetCurrentProcessId
unsigned short frag_and_flags;//3位标志位:?
unsigned char ttl;//8位生存时间 TTL:指是IP数据报能通过多少个路由器,每通过一个路由器TTL值就减去1,直到TTL为零时,路由器就会丢弃这个IP报 ?
unsigned char proto;//8位协议 (TCP, UDP 或其他):指的是上一层的协议(可以是TCP,UCP,ICMP,等协议)
unsigned short checksum;//16位IP首部校验和:检查报头的好坏
unsigned int sourceIP;//32位源IP地址:自己主机的地址
unsigned int destIP;//32位目的IP地址:对方主机的地址
}IpHeader;
//
//ICMP报头结构
//
typedef struct _icmphdr
{
BYTE i_type;//8位类型:指控制报文的消息类型 如:响应—请求消息类值是8,i_type=8;
BYTE i_code;//8位代码 编码:值赋为0,i_code=0;
USHORT i_cksum;//16位校验和:指检查数据报的好坏
USHORT i_id;//识别号(一般用进程号作为识别号):通常用进程(ID)号和线程(ID)号来表示这个值 i_id=GetCurrentProcessId或是 i_id =ident=GetCurrentProcessId
USHORT i_seq;//报文序列号:记录发送端发送的是第几号包,包的编码
ULONG timestamp;//时间戳 ?
}icmpHeader;
//
//计算效验和
//
unsigned short shecksum(unsigned short *buff,int size)
{
u_long cksum=0;
//将数据累加到cksum变量中
while(size>1)
{
cksum+=*buff++;
size-=sizeof(USHORT);
}
//将cksum的高16位和低16位相加,取反后得到效验和
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return (USHORT)(~cksum);
}
int main()
{
USHORT seq_no=0;//用于累加序列号,用于记录icmp包的编码
//加载库版本信息
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);//调用函数WSAStartup加载库版本信息,第几个版本
//创建原始套接字