#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)); }