【笔记】wincap发送数据包

来源:互联网 发布:见兄自然知悌什么意思 编辑:程序博客网 时间:2024/05/16 12:18

 

  尽管从 WinPcap 的名字上看,这个库的目标应该是数据捕捉(Packet Capture),然而,它也提供了针对很多其它有用的特性。在其中可以找到一组很完整的用于发送数据包的函数。

  请注意:原始的libpcap库是不支持发送数据包的,因此,这里展示的函数都属于是WinPcap的扩展,并且它们不能运行于Unix平台下

  一、使用pcap_sendpacket()发送单个数据包

  下面的代码展示了发送一个数据包的最简单的方式。打开适配器以后,调用pcap_sendpacket()来发送手工制作的数据包。pcap_sendpacket()的参数有一个要包涵发送数据的缓冲区,缓冲的长度,以及用来发送数据的适配器。

  注意,缓冲数据将直接发送到网络,而不会进行任何加工和处理。这就意味着应用程序需要创建一个正确的协议首部,来使这个数据包更有意义。

  程序源代码:

 

  二、发送队列

 

  pcap_sendpacket() 提供了一种简单而直接的方法来发送单个数据包,而send queues则提供了一种高级的,强大的,结构更优的方法来发送一组数据包。发送队列是一个容器,它能容纳不同数量的数据包,这些数据包将被发送到网络上。队列有大小,它代表了它能存储的数据包的最大数量。

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

  一旦发送队列被创建,pcap_sendqueue_queue()就可以将数据包添加到发送队列中。这个函数的参数包含一个 pcap_pkthdr 的结构体,它包含时间戳和长度,同时,参数还包含一个指向数据包数据的缓冲。这些参数和那些被 pcap_next_ex() 和 pcap_handler()接收到的数据相同,因此,为那些刚刚捕获到的,或是从文件读取出来的数据包排队,就相当于把三个参数传递给pcap_sendqueue_queue()。 

  WinPcap提供了pcap_sendqueue_transmit()函数来发送一个队列。请注意第三个参数:如果非零,那么发送过程将是同步进行,也就是说,只有时间戳相符的数据包才会被处理。这个操作需要消耗大量的CPU资源,因为同步操作由内核驱动中的"忙等 (busy wait)"循环来实现的。尽管这个操作对CPU的要求很高,但它对包传送的处理结果,通常是很精确的。(通常在数微秒左右,或更小)

  请注意,使用pcap_sendqueue_transmit()要比pcap_sendpacket()来发送一系列数据更加有效率,因为发送队列保存在内核级的缓冲区,因此,减少了上下文交换的次数。

  当队列不再需要时,我们可以使用pcap_sendqueue_destroy()来释放它所占用的内存。

  下一个程序将演示如何使用发送队列。先用pcap_open_offline()打开一个捕获文件,然后,将文件中的数据包移到已分配的发送队列。这时,就可以发送队列了,如果用户指定了同步,那么它将同步发送队列。

  注意,堆文件的链路层将会那些发送数据包接口中的一个进行比较,那些接口使用pcap_datalink()发送数据包。当比较的结果不相同,那么就会打印出警告信息。捕获文件的链路层和适配器的链路层相一致是非常重要的,不然,发送将变得毫无意义。

  程序源代码:
 

 

 

原创粉丝点击