Qt获取网络流量(调用Windows API)----StateReader系列

因自己的笔记本没有带CapLock和NumLock的灯,导致某一次输入密码一直出错。之前也找过类似的软件,当到了下载的时候开始犹豫不决,怕当时的程序留了后台,偷偷获取我的按键信息。于是下决心写个取电脑按键状态的程序。——此为背景

借着此势,顺便想给这个程序开发些新功能,于是想到了这个。可是在网上找了很久都没有找到Qt相关获取网卡流量的内容。无意间找到了在用Windows API获取流量的例子。

因为需要隔一定时间读取一次流量,于是选择了平时没怎么用过的QThread(用QTimer也完全可以实现同样的功能)。读取的功能主要放在run() 里,其中GetIfTable(….)是程序的关键部分,MSDN中有介绍,说是获取本地系统网卡的信息。
(GetIfTable参见https://msdn.microsoft.com/zh-cn/aa365943

知道了上面说到的那个很牛的API后,程序在实现上不是很难。
实现思路:获取本次的网络比特数d1,再读取下一时刻的网络比特数d2。于是可以算出它的网速:s = (d2-d1)/t。但这个函数读回来的数据没有360的准确,好像是360等公司是自己从NDI驱动上进行了修改并实现了读取。这方面对于我这个Qt小白就有些力不从心。

#include "winsock2.h" 
#include "windows.h"
#include "winsock.h"
#include "iphlpapi.h"

注意:上面的头文件一定需要,而且winsock2.h要放在上面,不信你可以试试。如果不写winsock2.h会出现很多错误:比如 “error: ‘ADDRESS_FAMILY’ does not name a type“。在解决这个问题的时候花了很多时间。

class NetInfoThread : public QThread
{
    void run();
}
void NetInfoThread::run()
{
    QString NetSpeedInfo;
    PMIB_IFTABLE    m_pTable = NULL;
    DWORD    m_dwAdapters = 0;
    ULONG    uRetCode = GetIfTable(m_pTable, &m_dwAdapters, TRUE);
    if (uRetCode == ERROR_NOT_SUPPORTED)
    {
        //return (-1);
        return;
    }

    if (uRetCode == ERROR_INSUFFICIENT_BUFFER)
    {
        m_pTable = (PMIB_IFTABLE)new BYTE[65535];   //假设端口数不超过65535个
    }

    DWORD   dwLastIn = 0;           //上一秒钟的接收字节数
    DWORD   dwLastOut = 0;          //上一秒钟的发送字节数
    DWORD   dwBandIn = 0;           //下载速度
    DWORD   dwBandOut = 0;          //上传速度

    while (!stopped)
    {
        NetSpeedInfo.clear();
        GetIfTable(m_pTable, &m_dwAdapters, TRUE);
        DWORD   dwInOctets = 0;
        DWORD   dwOutOctets = 0;

        //将所有端口的流量进行统计
        for (UINT i = 0; i < m_pTable->dwNumEntries; i++)
        {
            MIB_IFROW   Row = m_pTable->table[i];
            dwInOctets += Row.dwInOctets;
            dwOutOctets += Row.dwOutOctets;
        }

        dwBandIn = dwInOctets - dwLastIn;       //下载速度
        dwBandOut = dwOutOctets - dwLastOut;    //上床速速
        if (dwLastIn <= 0)
        {
            dwBandIn = 0;
        }
        else
        {
            dwBandIn = dwBandIn / 1024; //b转换成kb
        }

        if (dwLastOut <= 0)
        {
            dwBandOut = 0;
        }
        else
        {
            dwBandOut = dwBandOut / 1024;   //b转换成kb
        }

        dwLastIn = dwInOctets;
        dwLastOut = dwOutOctets;

//        printf("收到字节: %u bytes\n", dwLastIn);
//        printf("发送字节: %u bytes\n", dwLastOut);
//        printf("下行速度: %u KB\n", dwBandIn);
//        printf("上行速度: %u KB\n", dwBandOut);
//        printf("--------------------------\n");
        NetSpeedInfo = QString("收到字节: %1 bytes\r\n"
                               "发送字节: %2 bytes\r\n"
                               "下行速度: %3 Kb\r\n"
                               "上行速度: %4 kb\r\n")
                                .arg(dwLastIn)
                                .arg(dwLastOut)
                                .arg(dwBandIn)
                                .arg(dwBandOut);
        emit netspeedResult(NetSpeedInfo);
        sleep(1);       //休眠一秒钟
    }
    delete [] m_pTable;
}

上效果图:流量实时速度

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: qt-unified-windows-x86-4.0.1-online.exe 是一个 Qt 软件开发工具的安装程序,该工具可用于开发跨平台应用程序。 Qt 是一个跨平台 C++ 库,它能够使软件开发更加快速而且易于使用。Qt 库包含了很多模块,包括 GUI、网络、数据库、XML 等等。Qt 软件开发工具是一个可以快速开发可运行于多个操作系统(如 Windows、OS X、Linux 和 Android)的跨平台应用程序的工具。 qt-unified-windows-x86-4.0.1-online.exe 是一个在线安装程序,它需要连接到 Qt 公司的服务器来下载和安装软件。安装过程中可以选择使用该工具以及可能需要的模块和对应的版本(如 Qt Creator、Qt DesignerQt WebEngine 等等)。注意:安装程序需要联网。 总之,Qt 软件开发工具是一个为了方便开发者快速创建跨平台应用程序而设计的工具。qt-unified-windows-x86-4.0.1-online.exe 是该工具的一个在线安装程序,方便用户自定义安装过程。 ### 回答2: qt-unified-windows-x86-4.0.1-online.exe是一个Qt跨平台开发工具的安装文件。它是一个在线安装程序,主要用于Windows操作系统中32位的x86架构。Qt是一个功能强大的开发工具包,它具有GUI开发工具、网络模块、数据库支持等功能,能够帮助开发者快速地构建高质量、可扩展性的应用程序。Qt的跨平台开发特点,使得开发者可以同时在多个平台上开发,只需一次编码,即可运行于不同的操作系统上。qt-unified-windows-x86-4.0.1-online.exe通过网络安装,能够自动下载和安装必要的组件和工具,从而降低了Qt工具包的安装难度和复杂度。此外,Qt还提供了C++语言的编程接口和QML语言的脚本编写方式,使得开发者能够根据自己的需要选择不同的编程方式来进行应用程序的开发。因此,qt-unified-windows-x86-4.0.1-online.exe是一个非常有用的工具,适合想要开发跨平台应用程序的开发者使用。 ### 回答3: qt-unified-windows-x86-4.0.1-online.exe是一款QT开发环境的安装程序,适用于Windows x86系统。使用这个程序可以帮助开发者在Windows系统上快速安装QT开发环境。QT是一款跨平台开发框架,用于开发桌面应用、移动应用和嵌入式应用等。QT开发框架支持C++编程语言,并提供了一系列丰富的库,开发者可以使用这些库来构建自己的应用程序。 qt-unified-windows-x86-4.0.1-online.exe是一款在线安装程序,它需要联网下载QT开发环境的相关组件。安装过程中,开发者可以选择需要安装的组件,例如QT Creator、QT Designer等等。安装完成后,开发者就可以开始使用QT开发框架来开发自己的应用程序了。 总之,QT开发框架是一款十分强大的开发工具,它可以帮助开发者快速构建跨平台的应用程序。qt-unified-windows-x86-4.0.1-online.exe则是一款方便快捷的安装程序,可以帮助开发者在Windows x86系统上快速安装QT开发环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值