深度剖析WinPcap之(九)——数据包的..
时间:2010-09-06 来源:runhook
1.6.2 发送队列方式的接口实现
在下列两种发送方式都不适用的情况下:
Ø应用软件每次发送一个数据包一次;
Ø应用软件每次发送一个数据包大于一次,次数预先设定;
为了能够发送大量的数据包,WinPcap提供了基于发送队列发送的方式。通过发送队列提供了一种高级的,强大的,结构更优的方式来发送一组数据包。
库wpcap.dll中与发送队列相关的函数所使用的pcap_send_queue结构体,是存储原始数据包(将被pcap_sendqueue_transmit函数发送到网络上的数据包)的数据结构,具体定义如下:
struct pcap_send_queue
{
u_int maxlen; //队列最大长度(字节数),描述了buffer成员的容量
u_int len; //队列当前的字节数
char *buffer; //储存待发数据包的缓冲区
};
typedef struct pcap_send_queue pcap_send_queue;
1.6.2.1 pcap_sendqueue_alloc与pcap_sendqueue_destroy函数
发送队列通过调用 pcap_sendqueue_alloc函数创建,并且需要指定队列的大小。函数的原型如下:
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);
函数分配存储发送数据包队列的内存空间,发送队列是一个容器,它能容纳不同数量的数据包,这些数据包将被pcap_sendqueue_transmit函数发送到网络上。其中参数memsize是队列的大小(以字节为单位),决定了发送队列能存储数据包的最大容量。
函数成功返回所分配队列的内存指针,否则返回NULL。
函数的具体实现如下:
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize)
{
pcap_send_queue *tqueue;
/* 分配发送队列结构体的内存空间*/
tqueue =
(pcap_send_queue*)malloc(sizeof(pcap_send_queue));
if(tqueue == NULL){
return NULL;
}
/*分配发送队列buffer成员的内存空间*/
tqueue->buffer = (char*)malloc(memsize);
if(tqueue->buffer == NULL){
free(tqueue);
return NULL;
}
tqueue->maxlen = memsize; //设置发送队列的最大存储空间
tqueue->len = 0; //初始化发送队列的已用存储空间
return tqueue;
}
注意内存空间大小memsize参数应该包括每个数据包的头信息(struct pcap_pkthdr)空间,使用示例如下:
squeue=pcap_sendqueue_alloc(
(unsigned int)((MaxPacketLen+sizeof(struct pcap_pkthdr))*npacks) );
当发送队列不再需要时,需要使用 pcap_sendqueue_destroy函数来释放它所占用的内存,该函数原型如下:
void pcap_sendqueue_destroy(pcap_send_queue *queue);
该函数销毁一个发送队列,释放与队列相关的所有内存空间。
函数的具体实现如下:
void pcap_sendqueue_destroy(pcap_send_queue* queue)
{
free(queue->buffer); //释放发送队列buffer成员的内存空间
free(queue); //释放发送队列结构体的空间
}
1.6.2.2 pcap_sendqueue_queue函数
一旦发送队列被创建,就可以通过pcap_sendqueue_queue函数将数据包添加到发送队列中,该函数把一个数据包添加到queue参数所指的发送队列的尾部。函数原型如下:
int pcap_sendqueue_queue(pcap_send_queue *queue,
const struct pcap_pkthdr *pkt_header,
const u_char *pkt_data)
其中参数queue就是调用pcap_sendqueue_alloc函数所分配的发送队列,参数pkt_header为WinPcap为待发数据包所附加的数据头信息,用来说明数据包的长度与发送时间戳,参数pkt_data为待发数据包。
函数成功返回0,否则返回-1。
结构体
相关阅读 更多 +