WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(九)——数据包的发送过程(2) 阅读

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

 2009-10-17 00:00:00 来源:WEB开发网   
核心提示:1.2 使用发送队列发送数据包的实例 我们采用实际代码演示如何通过pcap_sendqueue_transmit函数发送大量数据包,在main()函数中选择适合的适配器send_dev->name,深度剖析WinPcap之(九)——数据包的发送过程(2),确定发送数据包的个数npacks为200,与每个数据包之间

1.2     使用发送队列发送数据包的实例

我们采用实际代码演示如何通过pcap_sendqueue_transmit函数发送大量数据包。

在main()函数中选择适合的适配器send_dev->name,确定发送数据包的个数npacks为200,与每个数据包之间的时间间隔dus为30微秒,然后调用应用程序的send_queue函数发送数据包。

send_queue(send_dev->name,npacks,dus);

函数send_queue的主要代码如下:

void send_queue(char *dev,unsigned int npacks,unsigned int dus)
 
{
       pcap_t *fp;
       char errbuf[PCAP_ERRBUF_SIZE];
       int i;           
       unsigned int res;    
 
    //打开输出设备
    if ( (fp= pcap_open(dev,             // 设备名
                    100,             // 要捕获的部分 (只捕获前100个字节)
                    PCAP_OPENFLAG_PROMISCUOUS,  // 混杂模式
                    1000,            // 读超时时间
                    NULL,           // 远程机器验证
                    errbuf            // 错误缓冲
                    ) ) == NULL)
    {
        fprintf(stderr,"\n不能打开适配器. %s 不被WinPcap支持\n", dev);
        return;
    }
    
//发送数据包
 
       pcap_send_queue *squeue;      //发送队列    
       const int MaxPacketLen=100;    //数据包长度
       struct pcap_pkthdr mpktheader;    //数据包的包头
struct pcap_pkthdr *pktheader; 
pktheader=&mpktheader;
 
       timeval tv;                   //时间戳
       tv.tv_sec=0;
       tv.tv_usec=0;
 
    //分配发送队列
squeue=pcap_sendqueue_alloc(
(unsigned int)((MaxPacketLen+sizeof(struct pcap_pkthdr))*npacks) );
    
    //用数据包填充发送队列   
       unsigned char *pBuf=new unsigned char[MaxPacketLen];
       for(i=0;i<npacks;i++)
       {
              memset(pBuf,0x0,MaxPacketLen);       
              
              genPacket(pBuf,MaxPacketLen); //获得生成的数据包,长度为MaxPacketLen
              //设置数据包的包头
pktheader->ts=tv;
pktheader->caplen = MaxPacketLen;
              pktheader->len = MaxPacketLen;
              if (pcap_sendqueue_queue(squeue, pktheader, pBuf) == -1)
        {
            printf("警告: 数据包缓冲区太小,不是所有的数据包被发送.\n");
            break;
        }
              add_stamp(&tv,dus);  //增加时间戳
              pktheader->ts=tv;      //更新数据包头的时间戳
       }
       delete [] pBuf;
 
       //发送数据包
    if ((res = pcap_sendqueue_transmit(fp, squeue, 1)) < squeue->len)
    {
        printf("发送数据包时出现错误:%s. 仅%d字节被发送\n", 
pcap_geterr(fp), res);
    }   
 
    //释放发送队列
    pcap_sendqueue_destroy(squeue);
       
//关闭输出设备
       pcap_close(fp);
 
    return;     
 
}

1 2  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接