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