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

本文详细解析了wpcap.dll中用于发送数据包的pcap_sendpacket函数及其实现过程,包括如何通过调用packet.dll库的PacketSendPacket函数发送数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

1.6    wpcap.dll中相应函数接口的实现

wpcap.dll 主要依赖于 packet.dll 导出的 PacketSendPacket 函数与 PacketSendPackets 函数分别实现单个数据包发送与发送队列方式的发送。下面分析 wpcap.dll 中相应函数的内部实现。
1.6.1     发送单个数据包的接口实现
1.6.1.1               pcap_sendpacket函数
每调用一次函数pcap_sendpacket发送单个原始数据包一次(如果设置为只发送一次,参见packet.dll多次发送的说明)。函数原型如下:
int pcap_sendpacket(pcap_t *p, const u_char *buf, int size)
其中参数p是用来发送数据包的一个pcap_t类型描述符(可通过pcap_open函数获得该描述符),参数buf包含所要发送数据包的数据(包含数据包的协议头),参数sizebuf所指缓冲区的大小,也就是所要发送数据包的大小。无需包含MACCRC,因为它被网络接口的驱动程序计算并添加。该函数如果成功就返回0,否则返回-1
函数pcap_sendpacket的具体实现如下:
int pcap_sendpacket(pcap_t *p, const u_char *buf, int size)
{
    if (p->inject_op(p, buf, size) == -1)
       return (-1);
    return (0);
}
pcap_create函数中设置p->activate_oppcap_activate_win32函数,在pcap_activate_win32函数中设置p->inject_oppcap_inject_win32函数;
pcap_t * pcap_create(const char *device, char *ebuf)
{
    …
    p->activate_op = pcap_activate_win32;
    …  
}
 
static int pcap_activate_win32(pcap_t *p)
{
    …
    p->inject_op = pcap_inject_win32;
    …
}
可认为在pcap_sendpacket函数中调用pcap_inject_win32函数发送数据包。下面分析pcap_inject_win32函数的实现。
1.6.1.2               pcap_inject_win32函数
函数调用packet.dll库提供的 PacketSendPacket 函数发送数据包,具体实现如下:
static int pcap_inject_win32(pcap_t *p,
const void *buf, size_t size)
{
    LPPACKET PacketToSend;
 
/* 分配一个 _PACKET 结构体的内存空间 */
    PacketToSend=PacketAllocatePacket();  
    if (PacketToSend == NULL)
    { // 分配失败
       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"send error: PacketAllocatePacket failed" );
       return -1;
    }
 
     /* 初始化  _PACKET 结构体 */
    PacketInitPacket(PacketToSend,(PVOID)buf,size);
 
/* 发送数据包 */
    if(PacketSendPacket(p->adapter,PacketToSend,TRUE)
== FALSE)
{  // 发送失败
       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"send error: PacketSendPacket failed" );
       PacketFreePacket(PacketToSend);
       return -1;
    }
 
/* 释放 _PACKET 结构体的内存空间 */
    PacketFreePacket(PacketToSend);
 
    /* 假设如果 PacketSendPacket() 函数成功,就认为数据包全部被发送。
* 本函数期望返回所发送的字节数。
    */
    return size;
}
pcap_inject_win32函数中,首先分配一个_PACKET结构体的内存空间PacketToSend;接着,PacketInitPacket函数使用应用程序所传递的数据包数据buf与数据包大小size参数初始化PacketToSend所指的内存空间;然后调用PacketSendPacket发送数据包;最后调用PacketFreePacket函数释放PacketToSend所指的内存空间。其中_PACKET结构体,cketAllocatePacketPacketInitPacketPacketSendPacketPacketFreePacket函数都由packet.dll提供,将在下一节中分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值