下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用......
/*物理帧头结构*/
typedef struct {
?? BYTE? desmac[6]; //目的MAC地址
?? BYTE? srcmac[6]; //源MAC地址
??USHORT? ethertype; //帧类型
}Dlc_Header;??????
/*IP报头结构*/
typedef struct? {
?BYTE? h_len_ver; ?//IP版本号(高4位)及以32比特为单位的IP包头部的长度(低四位)
?BYTE? tos;????? //服务类型TOS
?USHORT total_len; //IP包总长度?
?USHORT ident;???? //标识
?USHORT frag_and_flags;? //标志位
?BYTE ttl;????? //生存时间
?BYTE proto;??? //协议
?USHORT checksum; //IP首部校验和
?BYTE? sourceip[4]; //源IP地址(32位)
?//或者UINT?sourceip;
?BYTE? destip[4];? //目的IP地址(32位)
//或者 UINT ?destip;
}Ip_Header;
/*TCP报头*/
typedef struct {
?USHORT? srcport; // 源端口
?USHORT ?dstport; // 目的端口
?UINT ?seqnum;? // 顺序号
?UINT ?acknum;? //期待获得对方的TCP包编号
?BYTE h_len;? // 以32比特为单位的TCP报头长度
?BYTE? flags; // 标志(URG、ACK等)
?USHORT indow; // 窗口大小
?USHORT chksum; // 校验和
?USHORT urgptr; // 紧急指针
}Tcp_Header;
//TCP伪首部 用于进行TCP校验和的计算,保证TCP效验的有效性
typedef struct{
ULONG sourceip;//源IP地址
ULONG destip;//目的IP地址
BYTE mbz;//置空(0)
BYTE ptcl;//协议类型(IPPROTO_TCP)
USHORT tcpl;//TCP头的长度(单位:字节)
}PSD_HEADER;
/*UDP报头*/
typedef struct ?{
USHORT srcport; // 源端口
USHORT dstport; // 目的端口
USHORT total_len; // 包括UDP报头及UDP数据的长度(单位:字节)
USHORT chksum; // 校验和
}Udp_Header;
//UDP伪首部-仅用于计算校验和
typedef struct tsd_hdr
{
BYTE sourceip[4]; //源IP地址
BYTE destip[4]; //目的IP地址
BYTE mbz;//置空(0)
BYTE ptcl; //协议类型(IPPROTO_UDP)
USHORT udpl;//UDP包总长度(不包括伪首部的长度 单位:字节)
}PSD_HEADER;
/*ICMP报头*/
typedef struct {
?BYTE i_type;?? //类型 发出的ICMP为8(ICMP_ECHO_REQUEST),接受到的ICMP为0
?BYTE i_code;?? //代码
?USHORT i_cksum; //ICMP包校验和
?USHORT i_id;??? //识别号(一般用进程号作为标识号)
?USHORT i_seq;?? //报文序列号(一般设置为0)
?ULONG timestamp;//时间戳
}Icmp_Header;
//ARP帧结构
typedef struct {
?? USHORT HW_Type;//硬件类型Ethernet:0x1
?? USHORT Prot_Type;//上层协议类型IP:0x0800
?? BYTE HW_Addr_Len;//硬件地址长度:6
?? BYTE Prot_Addr_Len;//协议地址(IP地址)的长度:4
?? USHORT Flag;//1表示请求,2表示应答
?? BYTE Send_HW_Addr[6];//源MAC地址
?? BYTE Send_Prot_Addr[4];//源IP地址
?? BYTE Targ_HW_Addr[6];//目的MAC地址
?? BYTE Targ_Prot_Addr[4];//目的IP地址
?? BYTE Padding[18];//填充数据?
}Arp_Frame;
/*DNS数据报头*/
typedef struct {
USHORT id; //标识,通过它客户端可以将DNS的请求与应答相匹配;
USHORT flags; //标志:(查询)0x0100 (应答)0x8180? 这些数字都是主机序
USHORT questions; //问题数目
USHORT answers; //资源记录数目
USHORT author; //授权资源记录数目
USHORT addition; //额外资源记录数目
}DNS_HEADER;
//这是DNS包的公共部分,即查询包及应答包都含有这部分,由于查询问题(Domain)大小无法确定,因此这里不好将其及其以后的数据写入结构体中
本博客于即日起(2009.2.26)停止更新,