這支程式會用到以下的元件與方法:
- 使用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;
1 意見:
ok
張貼留言