WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(九)——数据包的发送过程 阅读

深度剖析WinPcap之(九)——数据包的发送过程

 2009-10-17 00:00:00 来源:WEB开发网   
核心提示: 为发送数据包,一个用户层应用程序在NPF设备上执行一个WriteFile()系统调用,深度剖析WinPcap之(九)——数据包的发送过程(2),这样发送每一个数据包都需要一次系统调用,网络数据包的发送效率并不是非常高,该函数原型如下:intpcap_sendqueue_queue(pcap_se

为发送数据包,一个用户层应用程序在NPF设备上执行一个WriteFile()系统调用。这样发送每一个数据包都需要一次系统调用,网络数据包的发送效率并不是非常高。因为该原因,WinPcap添加了使用一次写系统调用就能把单个数据包发送多次的功能。用户层应用程序能够设置单个数据包发送的次数,例如设为1000,那么应用程序所写的每个原始数据包在驱动设备文件上都将会发送1000次。不过该功能只在packet.dll中提供辅助接口函数PacketSetNumWrites设置发送次数,而在wpcap.dll中并没有对应的函数接口。应用程序能够用该特性为测试的目的生成高速的网络流量:上下文切换的负载不再出现,因此性能显著性的变好。

在上述两种发送方式都不适用的情况下,为了能够发送大量的数据包,WinPcap提供了基于发送队列发送的方式。通过发送队列提供了一种高级的,强大的,结构更优的方式来发送一组数据包。

发送队列通过调用 pcap_sendqueue_alloc函数创建,并且需要指定队列的大小。

pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);

该函数分配一个发送队列。发送队列是一个容器,它能容纳不同数量的数据包,这些数据包将被pcap_sendqueue_transmit函数发送到网络上。其中参数memsize是队列的大小,用以字节为单位,决定了发送队列能存储数据包的最大容量。

一旦发送队列被创建,就可以通过pcap_sendqueue_queue函数将数据包添加到发送队列中。该函数原型如下:

int pcap_sendqueue_queue(pcap_send_queue *queue,const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)  

该函数把一个数据包添加到queue参数所指的发送队列的尾部。参数pcap_pkthdr结构体包含数据包的时间戳和长度,参数pkt_data是一个指向数据包数据的缓冲区的指针。

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接