sniffer (Winpcap + MFC) (4) 를 한 걸음 한 걸음 개발 하려 면 프로 토 콜 헤드 - 각 층 네트워크 프로 토 콜 헤드 의 실현 을 남 겨 두 어야 합 니 다.

이 장 은 사실상 아무런 말 도 하지 않 는 다. 바로 협의의 기준 을 이해 한 후에 데이터 구조 로 이 를 실현 하면 된다.바로 코드 에 올 라 가세 요. 밑바닥 에서 고위 층 까지 점차적으로 이 루어 집 니 다.이 프로 토 콜 헤드 가 어떻게 사용 되 는 지 는 다음 장 에서 설명 할 것 이다.
#ifndef PROTOCOL_H
#define PROTOCOL_H

#define PROTO_ICMP 1
#define PROTO_TCP 6					
#define PROTO_UDP 17					 
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN    4321


//Mac    14   
typedef struct ethhdr
{
	u_char dest[6];			//6        
	u_char src[6];				//6       
	u_short type;				//2      
};

//ARP 
typedef struct arphdr
{
	u_short ar_hrd;						//    
	u_short ar_pro;						//    
	u_char ar_hln;						//      
	u_char ar_pln;						//      
	u_short ar_op;						//   ,1    2   
	u_char ar_srcmac[6];			//   MAC
	u_char ar_srcip[4];				//   IP
	u_char ar_destmac[6];			//   MAC
	u_char ar_destip[4];				//   IP
};

//  IP  
typedef struct iphdr
{
#if defined(LITTLE_ENDIAN)
	u_char ihl:4;
    u_char version:4;
#elif defined(BIG_ENDIAN)
	u_char version:4;
	u_char  ihl:4;
#endif
	u_char tos;				//TOS     
	u_short tlen;			//    u_short     
	u_short id;				//  
	u_short frag_off;	//   
	u_char ttl;				//    
	u_char proto;		//  
	u_short check;		//   
	u_int saddr;			//   
	u_int daddr;			//    
	u_int	op_pad;		//   
};

//  IP  
/*typedef struct iphdr
{
	u_char ver_ihl;
	u_char tos;				//TOS     
	u_short tlen;			//    u_short     
	u_short id;				//  
	u_short frag_off;	//   
	u_char ttl;				//    
	u_char proto;		//  
	u_short check;		//   
	u_int saddr;			//   
	u_int daddr;			//    
	u_int	op_pad;		//   
};*/


//  TCP 
typedef struct tcphdr
{
	u_short sport;							//       16 
	u_short dport;							//       16 
	u_int seq;									//    32 
	u_int ack_seq;							//      
#if defined(LITTLE_ENDIAN)
	u_short res1:4,
				doff:4,
				fin:1,
				syn:1,
				rst:1,
				psh:1,
				ack:1,
				urg:1,
				ece:1,
				cwr:1;
#elif defined(BIG_ENDIAN)
	u_short doff:4,
				res1:4,
				cwr:1,
				ece:1,
				urg:1,
				ack:1,
				psh:1,
				rst:1,
				syn:1,
				fin:1;
#endif
	u_short window;					//     16 
	u_short check;						//    16 
	u_short urg_ptr;					//     16 
	u_int opt;								//  
};

/*typedef struct tcphdr
{
	u_short sport;						//       16 
	u_short dport;						//       16 
	u_int seq;								//    32 
	u_int ack_seq;						//      
	u_short doff_flag;					//   、   、   
	u_short window;					//     16 
	u_short check;						//    16 
	u_short urg_ptr;					//     16 
	u_int opt;								//  
};*/

//  UDP 
typedef struct udphdr
{
	u_short sport;		//     16 
	u_short dport;		//     16 
	u_short len;			//      16 
	u_short check;		//    16 	
};

//  ICMP
typedef struct icmphdr
{
	u_char type;			//8    
	u_char code;			//8    
	u_char seq;			//    8 
	u_char chksum;		//8    
};

//  IPv6
typedef struct iphdr6
{
//#if defined(BIG_ENDIAN)
	u_int version:4,				//  
			flowtype:8,			//   
			flowid:20;				//   
/*#elif defined(LITTLE_ENDIAN)
u_int  flowid:20,				//   
			flowtype:8,			//   
			version:4;				//  
//#endif*/
	u_short plen;					//      
	u_char nh;						//     
	u_char hlim;					//   
	u_short saddr[8];			//   
	u_short daddr[8];			//    
};

//  ICMPv6
typedef struct icmphdr6
{
	u_char type;			//8    
	u_char code;			//8    
	u_char seq;			//    8 
	u_char chksum;		//8    
	u_char op_type;	//  :  
	u_char op_len;		//  :  
	u_char op_ethaddr[6];		//  :     
};

//        
typedef struct pktcount
{
	int n_ip;
	int n_ip6;
	int n_arp;
	int n_tcp;
	int n_udp;
	int n_icmp;
	int n_icmp6;
	int n_http;
	int n_other;
	int n_sum;
};

//////////////////////////////////////////////////////////////////////////
//        
typedef struct datapkt
{	
	char  pktType[8];					//   
	int time[6];								//  
	int len;									//  

	struct ethhdr* ethh;				//     

	struct arphdr* arph;				//ARP  
	struct iphdr* iph;					//IP  
	struct iphdr6* iph6;				//IPV6

	struct icmphdr* icmph;		//ICMP  
	struct icmphdr6* icmph6;	//ICMPv6  
	struct udphdr* udph;			//UDP  
	struct tcphdr* tcph;				//TCP  

	void *apph;							//     
};
#endif

좋은 웹페이지 즐겨찾기