[C++]製作一個簡單的網卡上下行速度測量器-使用Iphlpapi.dll

前天開會的時候想說網卡不是都有顯示傳送多少封包,收到多少封包。那如果我要知道傳送速率和接收速率呢?找了一些資料,本想延續之前用winpcap的方式,順便連送包和壓力測試都一起寫,後來就覺得單純點好。找到有人用Windows內建的Iphlpapi.dll裡頭的function來做。大部分都是顯示當前的傳送包和接收包數據,我拿來改一下,顯示成每秒多少筆,多少速率。

這支程式會用到以下的元件與方法:
- 使用DLL,並拿裡頭的function當參數來使用(GetProcAddress, LoadLibrary)
- Timer

--流程圖--
好像不用流程圖

--說明--
1. 調用DLL
2. 獲取網卡資訊並寫入List
3. 開啟Timer,定為每秒更新狀態
4. 保留前一秒數值,和這一秒數值相減計算,單位換算成MBps

--驗證--
實際上用瀏覽器去網路上下載東西,一邊開啟小程式選擇網卡,就可以看到上下載的速率了

--程式執行圖--

--完整Source Code(VC++ 2008 vaildated)
Download

--補充--
因為是要展示Timer的用法,可能在抓去時間上不是那麼準確。如果換成使用thread,while迴圈,然後用GetTickCount()去控制時間,會得到更準確的數據的。

數據結構體如下,順便加上查到的意義:
typedef struct _MIB_IFROW {
  WCHAR wszName[MAX_INTERFACE_NAME_LEN];//介面的名稱,Unicode字串
  DWORD dwIndex;//介面的index,會因為網卡disable/enable而變動
  DWORD dwType;//網路介面的型態,一般是=6,An Ethernet network interface
  DWORD dwMtu;//MTU(最大傳輸單元) size
  DWORD dwSpeed;//介面的傳輸速率(bps)
  DWORD dwPhysAddrLen;//實體位址長度
  BYTE  bPhysAddr[MAXLEN_PHYSADDR];//網卡實體位址
  DWORD dwAdminStatus;//網卡狀態,啟用=1,禁用=2
  DWORD dwOperStatus;//介面卡目前的狀態
  DWORD dwLastChange;//從電腦重新開機算起的時間,說是Vista之後不支援NDIS(底層網卡驅動)而返回0  DWORD dwInOctets;//接收到的byte數
  DWORD dwInUcastPkts;//接收到的unicast封包個數
  DWORD dwInNUcastPkts;//接收到的除了unicast之外的封包個數,包含multicast, broadcast
  DWORD dwInDiscards;//接收到的被丟棄的封包數,包含沒有錯誤的包
  DWORD dwInErrors;//接收到的因為錯誤而被丟棄的封包個數
  DWORD dwInUnknownProtos;//接收到的未知協定的封包個數
  DWORD dwOutOctets;//傳送的byte數
  DWORD dwOutUcastPkts;//傳送的unicast封包個數
  DWORD dwOutNUcastPkts;//傳送的除了unicast之外的封包個數,包含multicast, broadcast
  DWORD dwOutDiscards;//傳送的被丟棄的封包數,包含沒有錯誤的包
  DWORD dwOutErrors;//傳送的因為錯誤而被丟棄的封包個數
  DWORD dwOutQLen;//這個欄位沒有使用到,算是Reserved
  DWORD dwDescrLen;//bDescr文字的長度
  BYTE  bDescr[MAXLEN_IFDESCR];//網卡介面的描述
} MIB_IFROW, *PMIB_IFROW;

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK