段階的にsniffer(Winpcap+MFC)を開発します.(四)これからは、プロトコルヘッドを残します.各層ネットワークプロトコルヘッドの実現です.
3924 ワード
この章は実際には何も言いません.協議の基準を分かり、データ構造でそれを実現すればいいです.直接コードをかけましょう.下の階から上の階まで徐々に実現します.これらの協議先はどのように使いますか?次の章で説明します.
#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