文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>深度剖析WinPcap之(九)——数据包的..

深度剖析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。
结构体
排行榜 更多 +
方块枪战战场安卓版

方块枪战战场安卓版

飞行射击 下载
战斗火力射击安卓版

战斗火力射击安卓版

飞行射击 下载
空中防御战安卓版

空中防御战安卓版

飞行射击 下载