深度剖析WinPcap之(九)——数据包的发送过程(4)
来源:互联网 发布:建筑拆除优化设计 编辑:程序博客网 时间:2024/05/21 09:34
本文转自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包含所要发送数据包的数据(包含数据包的协议头),参数size是buf所指缓冲区的大小,也就是所要发送数据包的大小。无需包含MAC的CRC,因为它被网络接口的驱动程序计算并添加。该函数如果成功就返回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_op为pcap_activate_win32函数,在pcap_activate_win32函数中设置p->inject_op为pcap_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结构体,cketAllocatePacket、PacketInitPacket、PacketSendPacket、PacketFreePacket函数都由packet.dll提供,将在下一节中分析。
- 深度剖析WinPcap之(九)——数据包的发送过程(4)
- 深度剖析WinPcap之(九)——数据包的发送过程(1)
- 深度剖析WinPcap之(九)——数据包的发送过程(2)
- 深度剖析WinPcap之(九)——数据包的发送过程(3)
- 深度剖析WinPcap之(九)——数据包的发送过程(5)
- 深度剖析WinPcap之(九)——数据包的发送过程(6)
- 深度剖析WinPcap之(九)——数据包的发送过程(7)
- 深度剖析WinPcap之(九)——数据包的发送过程(8)
- 深度剖析WinPcap之(九)——数据包的发送过程(9)
- 深度剖析WinPcap之(九)——数据包的发送过程(10)
- 深度剖析WinPcap之(九)——数据包的发送过程(11)
- 深度剖析WinPcap之(九)——数据包的发送过程(12)
- 深度剖析WinPcap之(九)——数据包的发送过程(13)
- 深度剖析WinPcap之(九)——数据包的发送过程(13-2)
- 深度剖析WinPcap之(九)——数据包的发送过程(14)(完)
- 深度剖析WinPcap之(十)——数据包的内核过滤(4)
- 深度剖析WinPcap之(十)——数据包的内核过滤(1)
- 深度剖析WinPcap之(十)——数据包的内核过滤(2)
- linux 条件变量
- 深度剖析WinPcap之(九)——数据包的发送过程(3)
- DOM的Form对象
- extjs 表格锁定同时多表头
- Disable (initial) screen lock
- 深度剖析WinPcap之(九)——数据包的发送过程(4)
- 路径
- 深度剖析WinPcap之(九)——数据包的发送过程(5)
- 如何查看Windows Installer的Log文件
- 深度剖析WinPcap之(九)——数据包的发送过程(6)
- Spring,struts,hibernate常见的面试笔试题汇总(3)
- AS2.0 打造蜜蜂飞舞效果
- JGroups实现Java群组通讯
- 深度剖析WinPcap之(九)——数据包的发送过程(7)