winsen6

1.7      packet.dll对应得函数接口
 

packet.dll主要依赖于操作系统的系统调用WriteFileDeviceIoControl实现单个数据包发送与发送队列方式的发送。下面分析packet.dll中相应函数的内部实现。
1.7.1    发送单个数据包的接口实现
首先了解_PACKET结构体的定义,它提供了单个数据包发送的基本数据结构。
结构体_PACKET Common/ Packet32.h文件中定义的。该结构体的主要用途是为了数据包接收使用,不过packet.dll中也用来实现数据包的发送。对各字段的解释我们以源代码的注释为准,用于发送时的含义可作相应的理解。
/*该结构体包含从驱动程序来的一组数据包。
*该结构体定义了每个发送给应用程序的数据包的包头。
*/
typedef struct _PACKET { 
//包含数据包的缓冲区,
//参见PacketReceivePacket函数了解在该缓冲区进行数据组织细节
    PVOID        Buffer;     
    //缓冲区长度
UINT         Length;     
//缓冲区中出现的有效数据长度,
//比如最后调用PacketReceivePacket函数时所接收的数据大小
    DWORD        ulBytesReceived;   
}  PACKET, *LPPACKET;
 
1.7.1.1   PacketAllocatePacketPacketFreePacket函数
packet.dll中使用PacketAllocatePacket函数分配一个_PACKET结构体的内存空间,该函数在packetNtx/Dll/Packet32.c中实现,源代码如下:
LPPACKET PacketAllocatePacket(void)
{
    LPPACKET    lpPacket;
       
    lpPacket=(LPPACKET)GlobalAllocPtr(
GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof(PACKET));
    if (lpPacket==NULL)
    {//分配失败
    }
 
    return lpPacket;
}
使用GlobalAllocPtr分配一个_PACKET结构体大小的内存空间,同时对所分配的内存作清零处理。与PacketAllocatePacket对应的函数为PacketFreePacket ,做相反的事情,释放所分配的资源,源代码如下所示:
VOID PacketFreePacket (LPPACKET lpPacket)
{
    CloseHandle (lpPacket->OverLapped.hEvent);
    GlobalFreePtr (lpPacket);
}
 
1.7.1.2  PacketInitPacket函数
PacketInitPacket函数中,对待发数据包进行封装,其中ulBytesReceived字段为0
VOID PacketInitPacket(LPPACKET lpPacket,
PVOID Buffer,UINT Length)
{
    lpPacket->Buffer = Buffer;
    lpPacket->Length = Length;
    lpPacket->ulBytesReceived = 0;
    lpPacket->bIoComplete = FALSE;
}
 
1.7.1.3             PacketSendPacket函数
封装后的数据包,通过PacketSendPacket发送,该函数调用WriteFile系统调用。函数的具体实现如下:
BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,
LPPACKET lpPacket,BOOLEAN Sync)
{
    DWORD        BytesTransfered;
    BOOLEAN       Result;   
   
    UNUSED(Sync);
    if (AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)
    {
       Result = (BOOLEAN)WriteFile(AdapterObject->hFile,
lpPacket->Buffer,lpPacket->Length,
&BytesTransfered,NULL);
    }
    else
    {//未明设备类型
AdapterObject->Flags);
       Result = FALSE;
    }
 
    return Result;
}
 
      
     
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
标 题: 【原创】基于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、付费专栏及课程。

余额充值