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

本文转自http://eslxf.blog.51cto.com/918801/214879

 

1.7.2    单个数据包发送多次的接口实现

为发送数据包,一个用户层应用程序在NPF设备上执行一个WriteFile系统调用。这样发送每一个数据包都需要一次系统调用,网络数据包的发送效率并不是非常高。因为该原因,WinPcap添加了使用一次写系统调用就能把单个数据包发送多次的功能。用户层应用程序能够设置单个数据包发送的次数,例如设为1000,那么应用程序所写的每个原始数据包在驱动设备文件上都将会发送1000次。应用程序能够用该特性为测试目的生成高速的网络流量:上下文切换的负载不再出现,因此性能显著性的变好。
注意:该功能只在packet.dll中提供了辅助接口函数PacketSetNumWrites设置发送次数,而在wpcap.dll中并没有对应的函数接口。
packet.dll中,提供单个数据包发送多次的函数接口,通过PacketSetNumWrites函数设置重复发送的次数,函数PacketSetNumWrites的源代码如下:
BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites)
{
    DWORD BytesReturned;
    BOOLEAN Result;
 
    if(AdapterObject->Flags != INFO_FLAG_NDIS_ADAPTER)
    {//未明设备类型,函数返回
       return FALSE;
    }
 
Result = (BOOLEAN)DeviceIoControl(AdapterObject->hFile,
BIOCSWRITEREP,&nwrites,4,NULL,0,&BytesReturned,NULL);
 
    return Result;
}
通过DeviceIoControl系统调用设置重复次数,重复发送实际上是在NPFNPF_Write函数中执行的,参见下节的代码分析。
系统调用函数DeviceIoControl()对一个特定的设备驱动程序发送一个控制码,导致对应的设备执行相应的操作。该函数原型如下:
BOOL DeviceIoControl(
    HANDLE hDevice,
    DWORD dwIoControlCode,
    LPVOID lpInBuffer,
    DWORD nInBufferSize,
    LPVOID lpOutBuffer,
    DWORD nOutBufferSize,
    LPDWORD lpBytesReturned,
    LPOVERLAPPED lpOverlapped
);
其中各参数的含义如下:
hDevice 输入参数,执行操作的设备句柄, PacketSetNumWrites()函数中传入AdapterObject->hFile值,为所打开的NPF适配器的句柄。
dwIoControlCode输入参数,控制码,PacketSetNumWrites()函数中传入BIOCSWRITEREP值,来设置冲发次数。
lpInBuffer输入参数,指向包含操作所需输入参数的内存区。PacketSetNumWrites()函数中传入nwrites变量的的起始地址,该变量储存了重发的次数。
nInBufferSize输入参数,输入参数内存区的字节数,PacketSetNumWrites()函数中传入的值为4,也就是nwrites变量所占的字节数。
lpOutBuffer 输出参数,指向接收操作返回数据的输出内存区。PacketSetNumWrites()函数中不用该参数,为NULL
nOutBufferSize输入参数,输出参数内存区的字节数, PacketSetNumWrites()函数中不用该参数,为0
lpBytesReturned输出参数,存储在输出参数内存区中的数据字节数, PacketSetNumWrites()函数中传入BytesReturned变量的的起始地址,该变量返回输出参数内存区的数据字节数。
lpOverlapped 输入参数,指向一个OVERLAPPED 结构体的指针。如果hDevice 没有使用 FILE_FLAG_OVERLAPPED表示打开,就不用理会lpOverlapped PacketSetNumWrites()函数中不用该参数,为NULL
如果DeviceIoControl函数成功,返回非0值,否则返回0。 PacketSetNumWrites()函数并不对返回值进行检查,而是直接返回该值,由更上层的函数执行检查。

标 题: 【原创】基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 作 者: 加百力 时 间: 2009-05-18,16:55:36 链 接: http://bbs.pediy.com/showthread.php?t=89175 【文章标题】: 基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 【文章作者】: 加百力 【软件名称】: WinPCap 【下载地址】: http://www.winpcap.org/ 【内部编号】: MASSADA 0029 【编写语言】: C++ 【使用工具】: VS2005 【操作平台】: Windows 2003 -------------------------------------------------------------------------------- 【详细过程】 在第一篇文章中我们提到WinPCap的基本功能之一就是:  1> 在网络发送原始的数据包发送原始数据包难度不大,只需要应用几个简单的函数就可以了。 我编写炮王程序的主要目的是为了测试WinPCap/libpcap的抓包能力,在不同网速和数据包大小的条件下libpcap的抓包率有多少。 炮王特点: 01、可以发送任意协议的数据包。TCP/IP等等。 02、针对每次发包,会返回状态,可以检测是否成功。在程序中如果失败会自动退出。 03、可以随机修改数据包的:源、目的MAC地址,IP地址,端口、数据内容等属性信息。 04、使用多线程发包,在XP下最多可以同时开2000个线程发包,发包速度快,流量大。在千兆网卡上可以超过15M/s的速度。 05、自动统计发包时间,计算每秒发包数量,流量。 06、可以设置发包的时间间隔,最少到1毫秒。 炮王使用方法: 首先直接运行pw.exe可以看到程序提示的参数信息和显示的当前可用网卡信息。可用网卡信息会保存在CardsInfo.txt文件中。 打开BAT脚本,修改网卡信息,即可。 运行脚本,脚本将数据包文件发送出去。 注意:总的发包数量等于每个线程的发包数量乘以线程总数。 实验的数据包文件都是MSN消息。 具体代码请看附件。 -------------------------------------------------------------------------------- 【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值