qt在windows7系统实时显示网络利用率

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include "windows.h"
//#include "iphlpapi.h"
//#include "netioapi.h"
#define IF_MAX_STRING_SIZE 256
#define IF_MAX_PHYS_ADDRESS_LENGTH 32
#define ANY_SIZE 1
#define IF_TYPE_ETHERNET_CSMACD 6
typedef union _NET_LUID_LH
{
    ULONG64     Value;
    struct
    {
        ULONG64     Reserved:24;
        ULONG64     NetLuidIndex:24;
        ULONG64     IfType:16;                  // equal to IANA IF type
    }Info;
} NET_LUID_LH, *PNET_LUID_LH;
typedef NET_LUID_LH NET_LUID;
typedef NET_LUID* PNET_LUID;
typedef ULONG NET_IFINDEX, *PNET_IFINDEX;
typedef ULONG IFTYPE;
typedef enum {
    TUNNEL_TYPE_NONE = 0,
    TUNNEL_TYPE_OTHER = 1,
    TUNNEL_TYPE_DIRECT = 2,
    TUNNEL_TYPE_6TO4 = 11,
    TUNNEL_TYPE_ISATAP = 13,
    TUNNEL_TYPE_TEREDO = 14
} TUNNEL_TYPE, *PTUNNEL_TYPE;
typedef enum _NDIS_MEDIUM
{
    NdisMedium802_3,
    NdisMedium802_5,
    NdisMediumFddi,
    NdisMediumWan,
    NdisMediumLocalTalk,
    NdisMediumDix,              // defined for convenience, not a real medium
    NdisMediumArcnetRaw,
    NdisMediumArcnet878_2,
    NdisMediumAtm,
    NdisMediumWirelessWan,
    NdisMediumIrda,
    NdisMediumBpc,
    NdisMediumCoWan,
    NdisMedium1394,
    NdisMediumInfiniBand,
#if ((NTDDI_VERSION >= NTDDI_LONGHORN) || NDIS_SUPPORT_NDIS6)
    NdisMediumTunnel,
    NdisMediumNative802_11,
    NdisMediumLoopback,
#endif // (NTDDI_VERSION >= NTDDI_LONGHORN)
    NdisMediumMax               // Not a real medium, defined as an upper-bound
} NDIS_MEDIUM, *PNDIS_MEDIUM;
typedef enum _NDIS_PHYSICAL_MEDIUM
{
    NdisPhysicalMediumUnspecified,
    NdisPhysicalMediumWirelessLan,
    NdisPhysicalMediumCableModem,
    NdisPhysicalMediumPhoneLine,
    NdisPhysicalMediumPowerLine,
    NdisPhysicalMediumDSL,      // includes ADSL and UADSL (G.Lite)
    NdisPhysicalMediumFibreChannel,
    NdisPhysicalMedium1394,
    NdisPhysicalMediumWirelessWan,
    NdisPhysicalMediumNative802_11,
    NdisPhysicalMediumBluetooth,
    NdisPhysicalMediumInfiniband,
    NdisPhysicalMediumWiMax,
    NdisPhysicalMediumUWB,
    NdisPhysicalMedium802_3,
    NdisPhysicalMedium802_5,
    NdisPhysicalMediumIrda,
    NdisPhysicalMediumWiredWAN,
    NdisPhysicalMediumWiredCoWan,
    NdisPhysicalMediumOther,
    NdisPhysicalMediumMax       // Not a real physical type, defined as an upper-bound
} NDIS_PHYSICAL_MEDIUM, *PNDIS_PHYSICAL_MEDIUM;
typedef enum _NET_IF_ACCESS_TYPE
{
    NET_IF_ACCESS_LOOPBACK = 1,
    NET_IF_ACCESS_BROADCAST = 2,
    NET_IF_ACCESS_POINT_TO_POINT = 3,
    NET_IF_ACCESS_POINT_TO_MULTI_POINT = 4,
    NET_IF_ACCESS_MAXIMUM = 5
} NET_IF_ACCESS_TYPE, *PNET_IF_ACCESS_TYPE;
typedef enum _NET_IF_DIRECTION_TYPE
{
    NET_IF_DIRECTION_SENDRECEIVE,
    NET_IF_DIRECTION_SENDONLY,
    NET_IF_DIRECTION_RECEIVEONLY,
    NET_IF_DIRECTION_MAXIMUM
} NET_IF_DIRECTION_TYPE, *PNET_IF_DIRECTION_TYPE;
typedef enum {
    IfOperStatusUp = 1,
    IfOperStatusDown,
    IfOperStatusTesting,
    IfOperStatusUnknown,
    IfOperStatusDormant,
    IfOperStatusNotPresent,
    IfOperStatusLowerLayerDown
} IF_OPER_STATUS;
typedef enum _NET_IF_ADMIN_STATUS   // ifAdminStatus
{
    NET_IF_ADMIN_STATUS_UP = 1,
    NET_IF_ADMIN_STATUS_DOWN = 2,
    NET_IF_ADMIN_STATUS_TESTING = 3
} NET_IF_ADMIN_STATUS, *PNET_IF_ADMIN_STATUS;

typedef enum _NET_IF_MEDIA_CONNECT_STATE
{
    MediaConnectStateUnknown,
    MediaConnectStateConnected,
    MediaConnectStateDisconnected
} NET_IF_MEDIA_CONNECT_STATE, *PNET_IF_MEDIA_CONNECT_STATE;
typedef GUID NET_IF_NETWORK_GUID, *PNET_IF_NETWORK_GUID;

typedef enum _NET_IF_CONNECTION_TYPE
{
   NET_IF_CONNECTION_DEDICATED = 1,
   NET_IF_CONNECTION_PASSIVE = 2,
   NET_IF_CONNECTION_DEMAND = 3,
   NET_IF_CONNECTION_MAXIMUM = 4
} NET_IF_CONNECTION_TYPE, *PNET_IF_CONNECTION_TYPE;

typedef struct _MIB_IF_ROW2 {
    //
    // Key structure.  Sorted by preference.
    //
    NET_LUID InterfaceLuid;
    NET_IFINDEX InterfaceIndex;

    //
    // Read-Only fields.
    //

    GUID InterfaceGuid;
    WCHAR Alias[IF_MAX_STRING_SIZE + 1];
    WCHAR Description[IF_MAX_STRING_SIZE + 1];
    ULONG PhysicalAddressLength;
    UCHAR PhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH];
    UCHAR PermanentPhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH];

    ULONG Mtu;
    IFTYPE Type;                // Interface Type.
    TUNNEL_TYPE TunnelType;     // Tunnel Type, if Type = IF_TUNNEL.
    NDIS_MEDIUM MediaType;
    NDIS_PHYSICAL_MEDIUM PhysicalMediumType;
    NET_IF_ACCESS_TYPE AccessType;
    NET_IF_DIRECTION_TYPE DirectionType;
    struct {
        BOOLEAN HardwareInterface : 1;
        BOOLEAN FilterInterface : 1;
        BOOLEAN ConnectorPresent : 1;
        BOOLEAN NotAuthenticated : 1;
        BOOLEAN NotMediaConnected : 1;
        BOOLEAN Paused : 1;
        BOOLEAN LowPower : 1;
        BOOLEAN EndPointInterface : 1;
    } InterfaceAndOperStatusFlags;

    IF_OPER_STATUS OperStatus;
    NET_IF_ADMIN_STATUS AdminStatus;
    NET_IF_MEDIA_CONNECT_STATE MediaConnectState;
    NET_IF_NETWORK_GUID NetworkGuid;
    NET_IF_CONNECTION_TYPE ConnectionType;

    //
    // Statistics.
    //
    ULONG64 TransmitLinkSpeed;
    ULONG64 ReceiveLinkSpeed;

    ULONG64 InOctets;
    ULONG64 InUcastPkts;
    ULONG64 InNUcastPkts;
    ULONG64 InDiscards;
    ULONG64 InErrors;
    ULONG64 InUnknownProtos;
    ULONG64 InUcastOctets;
    ULONG64 InMulticastOctets;
    ULONG64 InBroadcastOctets;
    ULONG64 OutOctets;
    ULONG64 OutUcastPkts;
    ULONG64 OutNUcastPkts;
    ULONG64 OutDiscards;
    ULONG64 OutErrors;
    ULONG64 OutUcastOctets;
    ULONG64 OutMulticastOctets;
    ULONG64 OutBroadcastOctets;
    ULONG64 OutQLen;
} MIB_IF_ROW2, *PMIB_IF_ROW2;

typedef struct _MIB_IF_TABLE2 {
    ULONG NumEntries;
    MIB_IF_ROW2 Table[ANY_SIZE];
} MIB_IF_TABLE2, *PMIB_IF_TABLE2;

typedef DWORD (WINAPI *pfnGetIfTable2)(PMIB_IF_TABLE2*);
typedef void (WINAPI *pfnFreeMibTable)(PVOID);

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void updateNetUsage();

private:
    Ui::MainWindow *ui;
    QTimer *m_pTimer;
    PMIB_IF_ROW2 m_pIfRow2;
    PMIB_IF_TABLE2 m_pIfTable2;
    qulonglong m_llPreRecv;
    qulonglong m_llPreSend;
    qulonglong m_llCurStream;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPalette>
#include <QBrush>
#include <QPixmap>
#include <QPushButton>
#include <QTreeView>
#include <QTreeWidgetItem>
#include <QBitmap>
#include <QMovie>
#include <QTableWidget>
#include <QHttp>
#include <QProgressDialog>
#include <QHBoxLayout>
#include <QSpacerItem>
#include <QVBoxLayout>
#include <QListWidget>
#include <QCheckBox>
#include <QLibrary>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qMemSet(&m_pIfRow2, 0, sizeof(PMIB_IF_ROW2));
    m_llPreRecv = 0;
    m_llPreSend = 0;
    m_llCurStream = 0;

    m_pTimer = new QTimer(this);
    connect(m_pTimer, SIGNAL(timeout()), SLOT(updateNetUsage()));
    m_pTimer->start(1000);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::updateNetUsage()
{
    //m_pTimer->stop();
    qulonglong llTotalRecv = 0;
    qulonglong llTotalSend = 0;
    qulonglong llNetSpeed = 0;

    pfnGetIfTable2 lib_lpGetIfTable2 = (pfnGetIfTable2)QLibrary::resolve("iphlpapi.dll", "GetIfTable2");
    pfnFreeMibTable lib_pfnFreeMibTable = (pfnFreeMibTable)QLibrary::resolve("iphlpapi.dll", "FreeMibTable");

    if (lib_lpGetIfTable2 && lib_pfnFreeMibTable)
    {
        if (lib_lpGetIfTable2(&m_pIfTable2) == NO_ERROR)
        {
            for (DWORD i = 0; i < m_pIfTable2->NumEntries; ++i)
            {
                m_pIfRow2 = (MIB_IF_ROW2*)&m_pIfTable2->Table[i];
                //if (m_pIfRow2->InOctets > 0)
//                {
//                    qDebug("i = %d", i);
//                    qDebug("type = %d", m_pIfRow2->Type);
//                    qDebug("inOctets = %d", m_pIfRow2->InOctets);
//                    llTotalRecv = m_pIfRow2->InOctets;
//                    llTotalSend = m_pIfRow2->OutOctets;
//                    llNetSpeed = (m_pIfRow2->TransmitLinkSpeed / 8  + m_pIfRow2->ReceiveLinkSpeed / 8) / 2;
//                    qDebug("TransmitLinkSpeed = %d", m_pIfRow2->TransmitLinkSpeed);
//                    qDebug("ReceiveLinkSpeed = %d", m_pIfRow2->ReceiveLinkSpeed);
//                    qDebug("llNetSpeed1: %d", llNetSpeed);
//                    //break;
//                }
                if (m_pIfRow2->Type == IF_TYPE_ETHERNET_CSMACD)
                //if (m_pIfRow2->Type == IF_TYPE_IEEE80211)
                //if (m_pIfRow2->Type == 6)
                {
                    qDebug("i = %d", i);
                    qDebug("type = %d", m_pIfRow2->Type);
                    qDebug("inOctets = %d", m_pIfRow2->InOctets);
                    llTotalRecv += m_pIfRow2->InOctets;
                    llTotalSend += m_pIfRow2->OutOctets;
                    llNetSpeed = (m_pIfRow2->TransmitLinkSpeed / 8  + m_pIfRow2->ReceiveLinkSpeed / 8) / 2;
                    qDebug("TransmitLinkSpeed = %d", m_pIfRow2->TransmitLinkSpeed);
                    qDebug("ReceiveLinkSpeed = %d", m_pIfRow2->ReceiveLinkSpeed);
                    qDebug("llNetSpeed1: %d", llNetSpeed);
                   // break;
                }
            }
            lib_pfnFreeMibTable(m_pIfTable2);
        }
    }
    double dDownloadSpeed = (llTotalRecv - m_llPreRecv) / 1024.0;
    double dUploadSpeed = (llTotalSend - m_llPreSend) / 1024.0;
    qDebug("llTotalRecv = %d", llTotalRecv);
    qDebug("llTotalSend = %d", llTotalSend);
    qDebug("m_llPreRecv = %d", m_llPreRecv);
    qDebug("m_llPreSend = %d", m_llPreSend);
    qDebug("Download speed: %f", dDownloadSpeed);
    qDebug("Upload speed: %f", dUploadSpeed);
    m_llCurStream = (llTotalRecv + llTotalSend) - (m_llPreRecv + m_llPreSend);
    qDebug("m_llCurStream: %f", m_llCurStream);
    qDebug("llNetSpeed2: %d", llNetSpeed);
    m_llPreRecv = llTotalRecv;
    m_llPreSend = llTotalSend;
    float fNetUsage = 100.0 * m_llCurStream / llNetSpeed;
    ui->lineEdit->setText(QString::number(fNetUsage));
}


 


 

猜你喜欢

转载自blog.csdn.net/sourire_will/article/details/12585283
今日推荐