NPF
允许把原始数据包发送到网络上,而且针对不同的应用提供了下列四种发送方式:
n
应用软件每次发送一个数据包一次;
n
应用软件每次发送一个数据包大于一次,次数预先设定;
n
应用软件每次发送一个数据包队列,并根据时间戳发送各数据包;
n
应用软件每次发送一个数据包队列,不根据时间戳,而是尽所能得快速发送各数据包;
数据包被发送到网络时,
NPF
并不对数据包作任何协议封装,因此应用程序必须构建每个数据包的不同协议头。一般情况下应用程序不需要生成
FCS
,它通常由网络适配器硬件计算,并在发送到网络前自动添加到每个数据包的尾部。
![](https://i-blog.csdnimg.cn/blog_migrate/d5aa7138831a4dd62dc5177f6a29370f.jpeg)
图9-1
函数调用关系图
1.1 wpcap.dll导出的相应函数接口
库
wpcap.dll
为了完成数据包发送的任务,提供了下列函数:
int pcap_sendpacket(pcap_t *p,u_char * buf,int size);
函数发送单个原始数据包一次
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);
函数分配一个发送队列
void pcap_sendqueue_destroy(pcap_send_queue *queue);
函数销毁一个发送队列,释放与队列相关的所有内存资源
int pcap_sendqueue_queue(pcap_send_queue *queue,const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);
函数把一个数据包添加到
queue
参数所指发送队列的尾部
u_int pcap_sendqueue_transmit(pcap_t *p,pcap_send_queue *queue,int sync)
;
函数发送一个原始数据包队列到网络
1.2 发送单个数据包的示例
我们采用实际代码演示如何通过
pcap_sendpacket
函数发送单个数据包。示例代码如下:
[send工程]