一步一步开发sniffer(Winpcap+MFC)(四)要想从此过,留下协议头——各层网络协议头的实现

这一章实际上没什么讲的,就是把协议的标准搞懂,然后用数据结构将其实现就行。直接上代码吧,由底层到高层逐步实现。这些协议头是怎么使用的,将在下一章做出解释。

[cpp]  view plain copy
  1. #ifndef PROTOCOL_H  
  2. #define PROTOCOL_H  
  3.   
  4. #define PROTO_ICMP 1  
  5. #define PROTO_TCP 6                   
  6. #define PROTO_UDP 17                       
  7. #define LITTLE_ENDIAN 1234  
  8. #define BIG_ENDIAN    4321  
  9.   
  10.   
  11. //Mac帧头 占14个字节  
  12. typedef struct ethhdr  
  13. {  
  14.     u_char dest[6];         //6个字节 目标地址  
  15.     u_char src[6];              //6个字节 源地址  
  16.     u_short type;               //2个字节 类型  
  17. };  
  18.   
  19. //ARP头  
  20. typedef struct arphdr  
  21. {  
  22.     u_short ar_hrd;                     //硬件类型  
  23.     u_short ar_pro;                     //协议类型  
  24.     u_char ar_hln;                      //硬件地址长度  
  25.     u_char ar_pln;                      //协议地址长度  
  26.     u_short ar_op;                      //操作码,1为请求 2为回复  
  27.     u_char ar_srcmac[6];            //发送方MAC  
  28.     u_char ar_srcip[4];             //发送方IP  
  29.     u_char ar_destmac[6];           //接收方MAC  
  30.     u_char ar_destip[4];                //接收方IP  
  31. };  
  32.   
  33. //定义IP头   
  34. typedef struct iphdr  
  35. {  
  36. #if defined(LITTLE_ENDIAN)  
  37.     u_char ihl:4;  
  38.     u_char version:4;  
  39. #elif defined(BIG_ENDIAN)  
  40.     u_char version:4;  
  41.     u_char  ihl:4;  
  42. #endif  
  43.     u_char tos;             //TOS 服务类型  
  44.     u_short tlen;           //包总长 u_short占两个字节  
  45.     u_short id;             //标识  
  46.     u_short frag_off;   //片位移  
  47.     u_char ttl;             //生存时间  
  48.     u_char proto;       //协议  
  49.     u_short check;      //校验和  
  50.     u_int saddr;            //源地址  
  51.     u_int daddr;            //目的地址  
  52.     u_int   op_pad;     //选项等  
  53. };  
  54.   
  55. //定义IP头   
  56. /*typedef struct iphdr 
  57. { 
  58.     u_char ver_ihl; 
  59.     u_char tos;             //TOS 服务类型 
  60.     u_short tlen;           //包总长 u_short占两个字节 
  61.     u_short id;             //标识 
  62.     u_short frag_off;   //片位移 
  63.     u_char ttl;             //生存时间 
  64.     u_char proto;       //协议 
  65.     u_short check;      //校验和 
  66.     u_int saddr;            //源地址 
  67.     u_int daddr;            //目的地址 
  68.     u_int   op_pad;     //选项等 
  69. };*/  
  70.   
  71.   
  72. //定义TCP头  
  73. typedef struct tcphdr  
  74. {  
  75.     u_short sport;                          //源端口地址  16位  
  76.     u_short dport;                          //目的端口地址 16位  
  77.     u_int seq;                                  //序列号 32位  
  78.     u_int ack_seq;                          //确认序列号   
  79. #if defined(LITTLE_ENDIAN)  
  80.     u_short res1:4,  
  81.                 doff:4,  
  82.                 fin:1,  
  83.                 syn:1,  
  84.                 rst:1,  
  85.                 psh:1,  
  86.                 ack:1,  
  87.                 urg:1,  
  88.                 ece:1,  
  89.                 cwr:1;  
  90. #elif defined(BIG_ENDIAN)  
  91.     u_short doff:4,  
  92.                 res1:4,  
  93.                 cwr:1,  
  94.                 ece:1,  
  95.                 urg:1,  
  96.                 ack:1,  
  97.                 psh:1,  
  98.                 rst:1,  
  99.                 syn:1,  
  100.                 fin:1;  
  101. #endif  
  102.     u_short window;                 //窗口大小 16位  
  103.     u_short check;                      //校验和 16位  
  104.     u_short urg_ptr;                    //紧急指针 16位  
  105.     u_int opt;                              //选项  
  106. };  
  107.   
  108. /*typedef struct tcphdr 
  109. { 
  110.     u_short sport;                      //源端口地址  16位 
  111.     u_short dport;                      //目的端口地址 16位 
  112.     u_int seq;                              //序列号 32位 
  113.     u_int ack_seq;                      //确认序列号  
  114.     u_short doff_flag;                  //头大小、保留位、标志位 
  115.     u_short window;                 //窗口大小 16位 
  116.     u_short check;                      //校验和 16位 
  117.     u_short urg_ptr;                    //紧急指针 16位 
  118.     u_int opt;                              //选项 
  119. };*/  
  120.   
  121. //定义UDP头  
  122. typedef struct udphdr  
  123. {  
  124.     u_short sport;      //源端口  16位  
  125.     u_short dport;      //目的端口 16位  
  126.     u_short len;            //数据报长度 16位  
  127.     u_short check;      //校验和 16位     
  128. };  
  129.   
  130. //定义ICMP  
  131. typedef struct icmphdr  
  132. {  
  133.     u_char type;            //8位 类型  
  134.     u_char code;            //8位 代码  
  135.     u_char seq;         //序列号 8位  
  136.     u_char chksum;      //8位校验和  
  137. };  
  138.   
  139. //定义IPv6  
  140. typedef struct iphdr6  
  141. {  
  142. //#if defined(BIG_ENDIAN)  
  143.     u_int version:4,                //版本  
  144.             flowtype:8,         //流类型  
  145.             flowid:20;              //流标签  
  146. /*#elif defined(LITTLE_ENDIAN) 
  147. u_int  flowid:20,               //流标签 
  148.             flowtype:8,         //流类型 
  149.             version:4;              //版本 
  150. //#endif*/  
  151.     u_short plen;                   //有效载荷长度  
  152.     u_char nh;                      //下一个头部  
  153.     u_char hlim;                    //跳限制  
  154.     u_short saddr[8];           //源地址  
  155.     u_short daddr[8];           //目的地址  
  156. };  
  157.   
  158. //定义ICMPv6  
  159. typedef struct icmphdr6  
  160. {  
  161.     u_char type;            //8位 类型  
  162.     u_char code;            //8位 代码  
  163.     u_char seq;         //序列号 8位  
  164.     u_char chksum;      //8位校验和  
  165.     u_char op_type; //选项:类型  
  166.     u_char op_len;      //选项:长度  
  167.     u_char op_ethaddr[6];       //选项:链路层地址  
  168. };  
  169.   
  170. //对各种包进行计数  
  171. typedef struct pktcount  
  172. {  
  173.     int n_ip;  
  174.     int n_ip6;  
  175.     int n_arp;  
  176.     int n_tcp;  
  177.     int n_udp;  
  178.     int n_icmp;  
  179.     int n_icmp6;  
  180.     int n_http;  
  181.     int n_other;  
  182.     int n_sum;  
  183. };  
  184.   
  185. //////////////////////////////////////////////////////////////////////////  
  186. //要保存的数据结构  
  187. typedef struct datapkt  
  188. {     
  189.     char  pktType[8];                   //包类型  
  190.     int time[6];                                //时间  
  191.     int len;                                    //长度  
  192.   
  193.     struct ethhdr* ethh;                //链路层包头  
  194.   
  195.     struct arphdr* arph;                //ARP包头  
  196.     struct iphdr* iph;                  //IP包头  
  197.     struct iphdr6* iph6;                //IPV6  
  198.   
  199.     struct icmphdr* icmph;      //ICMP包头  
  200.     struct icmphdr6* icmph6;    //ICMPv6包头  
  201.     struct udphdr* udph;            //UDP包头  
  202.     struct tcphdr* tcph;                //TCP包头  
  203.   
  204.     void *apph;                         //应用层包头  
  205. };  
  206. #endif  

你可能感兴趣的:(sinffer)