深度剖析WinPcap之(九)——数据包的发送过程
2009-10-17 00:00:00 来源:WEB开发网为发送数据包,一个用户层应用程序在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是一个指向数据包数据的缓冲区的指针。
- ››深度解释攻击linux服务器的四种级别
- ››剖析java.util.concurrent锁
- ››剖析Android智能手机系统的更多功能
- ››深度分析地方社区网站的内容定位
- ››剖析Windows Azure Platform框架与组成
- ››剖析使用 ObjectOutputStream 可能引起的内存泄漏...
- ››剖析EWebEditor编辑器漏洞攻击案例
- ››剖析开源云:构建 Infrastructure as a Service 块...
- ››深度剖析 Android 和 iPhone OS
- ››深度分析:HTML5能否成为Flash终结者
- ››深度挖掘 更多Windows 7快捷模式
- ››深度挖掘 Windows 7快捷模式
更多精彩
赞助商链接