zoukankan      html  css  js  c++  java
  • Qt5配置winpCap

    在网上查了很多资料,搞了差不多一天总算解决Qt5使用winPcap配置的问题了!记录一下 以便后续忘记

    1、下载winpcap4.1.3,百度即可搜索到

    2、下载winpCap开发者工具包http://www.winpcap.org/devel.htm 

    3、新建Qt控制台工程

    4、在.pro文件中添加如下代码  主要是配置头文件路径和库路径  由于我是放在C盘的,所以路径如下  路径可以自己定义

    INCLUDEPATH+=C:/WpdPack_4_1_2/WpdPack/Include
    LIBS+=C:/WpdPack_4_1_2/WpdPack/Lib/x64/wpcap.lib Packet.lib
    LIBS+=C:WpdPack_4_1_2WpdPackLiblibwpcap.a libpacket.a
    之前没有配置好路径 一直出现lnk2019的错误
    注意:一定是x64下的lib文件 因为下载的开发者包在lib的路径下有

    补充:其实可以将下载下来的winpcap开发者包的include和lib文件夹下面的所有内容复制到Qt安装目录下的include和lib文件夹下,在.pro文件中 只需添加如下代码即可
    LIBS+=wpcap.lib Packet.lib
    LIBS+=libwpcap.a libpacket.a//经过测试 这句可有可无 

    5、在CPP中添加如下代码
    #include <QCoreApplication>
    #include<QDebug>
    #include"pcap.h"
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        pcap_if_t *alldevs;
        pcap_if_t *d;
    
    
        int i=0;
        char errbuf[PCAP_ERRBUF_SIZE];
        if(pcap_findalldevs(&alldevs,errbuf)==-1)
        {
            qDebug()<<errbuf;
        }
        for(d=alldevs;d;d=d->next)
        {
            qDebug()<<++i<<d->name;
            if(d->description)
                qDebug()<<d->description;
            else
                qDebug()<<"No description available ";
        }
        if(0==i)
        {
            qDebug()<<"No interfaces found!Make sure WinPcap is installed";
        }
        pcap_freealldevs(alldevs);
    
    
        return a.exec();
    }
    6、截图

    7、提示
    a.Qt Creator的编译器不好!我在使用时先去删掉之前编译的debug文件,在使用绝对路径 在使用
    LIBS+=wpcap.lib Packet.lib(这是将winpcap的include和lib文件夹下的内容,Qt目录下的的include和lib中)


    8、winpcap获取制定是配置的包
    代码如下:
    #include <QCoreApplication>
    #include<QDebug>
    #define HAVE_REMOTE
    #include"pcap.h"
    //#include<remote-ext.h>
    #pragma comment(lib,"Iphlpapi.lib")
    #define TRACE(s) OutputDebugString(TEXT(s));
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
    
        pcap_if_t *alldevs;
            pcap_if_t *d;
            int inum;
            int i=0;
            pcap_t *adhandle;
            int res;
            char errbuf[PCAP_ERRBUF_SIZE];
            struct tm *ltime;
            char timestr[16];
            struct pcap_pkthdr *header;
            const u_char *pkt_data;
            time_t local_tv_sec;
    
    
    
    
            /* 获取本机设备列表 */
            if (pcap_findalldevs/*_ex*/(/*PCAP_SRC_IF_STRING, NULL,*/ &alldevs, errbuf) == -1)
            {
                fprintf(stderr,"Error in pcap_findalldevs: %s
    ", errbuf);
                exit(1);
            }
    
    
            /* 打印列表 */
            for(d=alldevs; d; d=d->next)
            {
                printf("%d. %s", ++i, d->name);
                if (d->description)
                    printf(" (%s)
    ", d->description);
                else
                    printf(" (No description available)
    ");
            }
    
    
            if(i==0)
            {
                printf("
    No interfaces found! Make sure WinPcap is installed.
    ");
                return -1;
            }
    
    
            printf("Enter the interface number (1-%d):",i);
            scanf("%d", &inum);
    
    
            if(inum < 1 || inum > i)
            {
                printf("
    Interface number out of range.
    ");
                /* 释放设备列表 */
                pcap_freealldevs(alldevs);
                return -1;
            }
    
    
            /* 跳转到已选中的适配器 */
            for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
    
    
            /* 打开设备 */
            if ( (adhandle= pcap_open(d->name,          // 设备名
                                      65536,            // 要捕捉的数据包的部分
                                      // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
                                      PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式
                                      1000,             // 读取超时时间
                                      NULL,             // 远程机器验证
                                      errbuf            // 错误缓冲池
                                      ) ) == NULL)
            {
                fprintf(stderr,"
    Unable to open the adapter. %s is not supported by WinPcap
    ", d->name);
                /* 释放设列表 */
                pcap_freealldevs(alldevs);
                return -1;
            }
    
    
            printf("
    listening on %s...
    ", d->description);
    
    
            /* 释放设备列表 */
            pcap_freealldevs(alldevs);
    
    
            /* 获取数据包 */
            while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){
    
    
                if(res == 0)
                {
                    /* 超时时间到 */
                    TRACE("Read Packet TimeOut!!");
                    continue;
                }
    
    
    
    
                static double m_Packet_Count = 0;
                static DWORD  m_PacketsLen = 0; //包的长度
                static DWORD  m_TickCount = 0;
                static double m_Speed = 0.0;
                m_PacketsLen+=header->len;//接受包的总长度
                m_Packet_Count ++;
    
    
                if(GetTickCount() - m_TickCount > 1000)//每秒读取计算一次。GetTickCount()返回的是毫秒数
                {
                    m_Speed = m_PacketsLen/1000.0;//speed .单位kbps
                    m_TickCount = GetTickCount();//返回从启动到当前经过的毫秒数
                    m_PacketsLen = 0;
                    printf("Packets:%.0f/s Speed:%.3f Kbps
    ",m_Packet_Count,m_Speed);
                    m_Packet_Count = 0;
                }
            }
    
    
            if(res == -1)
            {
                printf("Error reading the packets: %s
    ", pcap_geterr(adhandle));
                return -1;
            }
    
    
        return a.exec();
    }
    说明:需要添加如下内容 才可以在调用时,使用pacp_open,否则只能使用其他的函数去打开适配器。
    
    
  • 相关阅读:
    几个华为5300交换机故障的意思和可能产生的原因
    怎么让win7右下角只显示时间不显示日期 ?(可行)
    Linux下LDAP统一认证解决方案
    教你如何禁用U盘、屏蔽USB端口的三种方法
    开机自动启动一个新建文件夹
    端口
    输//ip提示找不到应用程序
    java单向加密算法小结(2)--MD5哈希算法
    java单向加密算法小结(1)--Base64算法
    Git初探--笔记整理和Git命令详解
  • 原文地址:https://www.cnblogs.com/tsh292278/p/10984548.html
Copyright © 2011-2022 走看看