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