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