// i386 is little_endian.
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN (1) //BYTE ORDER
#else
#error Redefine LITTLE_ORDER
#endif
//Mac頭部,總長度14字節
typedef struct _eth_hdr
{
unsigned char dstmac[6]; //目標mac地址
unsigned char srcmac[6]; //源mac地址
unsigned short eth_type; //以太網類型
}eth_hdr;
//IP頭部,總長度20字節
typedef struct _ip_hdr
{
#if LITTLE_ENDIAN
unsigned char ihl:4; //首部長度
unsigned char version:4, //版本
#else
unsigned char version:4, //版本
unsigned char ihl:4; //首部長度
#endif
unsigned char tos; //服務類型
unsigned short tot_len; //總長度
unsigned short id; //標誌
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存時間
unsigned char protocol; //協議
unsigned short chk_sum; //檢驗和
struct in_addr srcaddr; //源IP地址
struct in_addr dstaddr; //目的IP地址
}ip_hdr;
//TCP頭部,總長度20字節
typedef struct _tcp_hdr
{
unsigned short src_port; //源端口號
unsigned short dst_port; //目的端口號
unsigned int seq_no; //序列號
unsigned int ack_no; //確認號
#if LITTLE_ENDIAN
unsigned char reserved_1:4; //保留6位中的4位首部長度
unsigned char thl:4; //tcp頭部長度
unsigned char flag:6; //6位標誌
unsigned char reseverd_2:2; //保留6位中的2位
#else
unsigned char thl:4; //tcp頭部長度
unsigned char reserved_1:4; //保留6位中的4位首部長度
unsigned char reseverd_2:2; //保留6位中的2位
unsigned char flag:6; //6位標誌
#endif
unsigned short wnd_size; //16位窗口大小
unsigned short chk_sum; //16位TCP檢驗和
unsigned short urgt_p; //16爲緊急指針
}tcp_hdr;
//UDP頭部,總長度8字節
typedef struct _udp_hdr
{
unsigned short src_port; //遠端口號
unsigned short dst_port; //目的端口號
unsigned short uhl; //udp頭部長度
unsigned short chk_sum; //16位udp檢驗和
}udp_hdr;
//ICMP頭部,總長度4字節
typedef struct _icmp_hdr
{
unsigned char icmp_type; //類型
unsigned char code; //代碼
unsigned short chk_sum; //16位檢驗和
}icmp_hdr;