今天尝试用winpcap提供的pcap_sendpacket函数成功发送一个udp数据包到目的地址。 下面就来回顾一下过程。
首先用pcap_findalldevs得到网络接口,比如在我的机器上得到这样的结果:
1: /Device/NPF_GenericDialupAdapter
2: /Device/NPF_{06864041-9387-44DC-AF44-37779B0F2E9E}
现在我们及应用"/Device/NPF_{06864041-9387-44DC-AF44-37779B0F2E9E}“对应的接口发送数据。
由于发送数据必须自己构建以太网数据头, IP数据包头 和 UDP数据包头, 数据结构大概是这个样子的。
" 以太网数据头 | IP数据头 | UDP数据包头 | 数据"
以太网数据头结构如下,
struct ether_header{
u_char ether_dhost[ETHER_ADDR_LEN];
u_char ether_shost[ETHER_ADDR_LEN];
u_short ether_type; //如果上一层为IP协议。则ether_type的值就是0x0800
};
以太网地址填充什么数据, 我不是很清楚, 你可以填上实际的地址, 我这里全部填1.
IP数据头
struct ip_header //小端模式__LITTLE_ENDIAN
{
unsigned char ihl:4; //ip header length
unsigned char version:4; //version
u_char tos; //type of service
u_short tot_len; //total length
u_short id; //identification
u_short frag_off; //fragment offset
u_char ttl; //time to live
u_char protocol; //protocol type
u_short check; //check sum
u_int saddr; //source address
u_int daddr; //destination address
};
tot_len为 整个IP数据包长度 (IP数据头 | UDP数据包头 | 数据)
ihl 为IP数据头的总长度 除以4. (4字节对齐)
check 为在数据填好后, check为0 时的校验和, 是对于IP数据头。