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

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

 2009-10-17 00:00:00 来源:WEB开发网   
核心提示: 结构体pcap_pkthdr与timeval的定义分别如下:structpcap_pkthdr{structtimevalts;//时间戳bpf_u_int32caplen;//当前部分的长度lengthofportionpresentbpf_u_int32len;//数据包长度lengthth

结构体pcap_pkthdr与timeval的定义分别如下:

struct pcap_pkthdr {
struct timeval ts;  //时间戳
bpf_u_int32 caplen; // 当前部分的长度length of portion present
bpf_u_int32 len;  //数据包长度 length this packet (off wire)
}  
struct timeval {
bpf_int32    tv_sec;         // 秒数
      bpf_int32    tv_usec;        // 微秒
};

WinPcap提供了 pcap_sendqueue_transmit函数来发送一个队列,该函数原型如下:

u_int pcap_sendqueue_transmit(pcap_t *p,pcap_send_queue *queue,int sync)

该函数发送一个原始数据包队列到网络。参数p是指向适配器,数据包将通过该适配器发送,参数queue指向一个容纳带发送数据包的 pcap_send_queue结构体(参见 pcap_sendqueue_alloc与 pcap_sendqueue_queue函数),参数sync决定了发送操作是否是同步的;如果不为0,根据时间戳发送数据包,否则不根据时间戳,而是尽所能得快速发送各数据包。

函数的返回值为实际发送的字节数,如果该值小于希望发送的大小,那么发送过程中出现了错误。错误可能由驱动程序/适配器问题或矛盾的/假的发送队列导致。

请注意,使用 pcap_sendqueue_transmit函数要比 pcap_sendpacket函数来发送一系列数据更加有效率,因为发送队列保存在内核层驱动程序的缓冲区中,因此,减少了上下文交换的次数,获得更好的吞吐量。

同时请注意第三个参数sync。如果为非零值,那么发送过程将是同步进行,也就是说,只有与时间戳相符的数据包才会被处理。该同步操作由内核驱动程序“忙等待(busy wait)”循环来实现,所以这个操作需要消耗大量的CPU资源。尽管这个操作对CPU的要求很高,但它对数据包发送的处理结通常是很精确的(通常在可达数微秒左右,或更小)。 如此一个精度是采用pcap_sendpacket函数不可能达到的。

当发送队列不再需要时,我们可以使用 pcap_sendqueue_destroy函数来释放它所占用的内存,该函数原型如下:

void pcap_sendqueue_destroy(pcap_send_queue *queue);

该函数销毁一个发送队列,释放与队列相关的所有内存资源。

出处: http://eslxf.blog.51cto.com/918801/211982

上一页  1 2 3 

Tags:深度 剖析 WinPcap

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