2011-01-11 46 views
0

我用下面的代碼獲取帶寬帶寬計算(互聯網數據傳輸)

它的工作原理,但我有以下疑惑

1.I需要MB總的互聯網數據傳輸,如何轉換? ,傳輸的總數據(下載+上傳)隨其他帶寬監控應用程序而變化。我如何獲得確切的數據傳輸?

2.I需要排除在數據傳輸在本地局域網文件傳輸,該follwoing方法包括互聯網的數據傳輸+本地文件傳輸

Option Explicit 

Public Enum OperationalStates 
    MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0 
    MIB_IF_OPER_STATUS_UNREACHABLE = 1 
    MIB_IF_OPER_STATUS_DISCONNECTED = 2 
    MIB_IF_OPER_STATUS_CONNECTING = 3 
    MIB_IF_OPER_STATUS_CONNECTED = 4 
    MIB_IF_OPER_STATUS_OPERATIONAL = 5 
End Enum 
Public Enum InterfaceTypes 
    MIB_IF_TYPE_OTHER = 1 
    MIB_IF_TYPE_ETHERNET = 6 
    MIB_IF_TYPE_TOKENRING = 9 
    MIB_IF_TYPE_FDDI = 15 
    MIB_IF_TYPE_PPP = 23 
    MIB_IF_TYPE_LOOPBACK = 24 
    MIB_IF_TYPE_SLIP = 28 
End Enum 

Public Enum AdminStatuses 
    MIB_IF_ADMIN_STATUS_UP = 1 
    MIB_IF_ADMIN_STATUS_DOWN = 2 
    MIB_IF_ADMIN_STATUS_TESTING = 3 
End Enum 

Private Const MAXLEN_IFDESCR   As Integer = 256 
Private Const MAXLEN_PHYSADDR  As Integer = 8 
Private Const MAX_INTERFACE_NAME_LEN As Integer = 256 
Private Const ERROR_NOT_SUPPORTED As Long = 50 
Private Const ERROR_SUCCESS   As Long = 0 

Private Type MIB_IFROW 
    wszName(0 To 511)      As Byte 
    dwIndex         As Long '// index of the interface 
    dwType         As Long '// type of interface 
    dwMtu         As Long '// max transmission unit 
    dwSpeed         As Long '// speed of the interface 
    dwPhysAddrLen       As Long '// length of physical address 
    bPhysAddr(0 To 7)      As Byte '// physical address of adapter 
    dwAdminStatus       As Long '// administrative status 
    dwOperStatus        As Long '// operational status 
    dwLastChange        As Long 
    dwInOctets        As Long  '// octets received 
    dwInUcastPkts       As Long '// unicast packets received 
    dwInNUcastPkts       As Long '// non-unicast packets received 
    dwInDiscards        As Long '// received packets discarded 
    dwInErrors        As Long '// erroneous packets received 
    dwInUnknownProtos      As Long 
    dwOutOctets        As Long  '// octets sent 
    dwOutUcastPkts       As Long '// unicast packets sent 
    dwOutNUcastPkts       As Long '// non-unicast packets sent 
    dwOutDiscards       As Long '// outgoing packets discarded 
    dwOutErrors        As Long '// erroneous packets sent 
    dwOutQLen        As Long '// output queue length 
    dwDescrLen        As Long '// length of bDescr member 
    bDescr(0 To 255)       As Byte '// interface description 
End Type 

Private m_lngBytesReceived As Long 
Private m_lngBytesSent  As Long 

Private Declare Function GetIfTable _ 
      Lib "IPhlpAPI" (ByRef pIfRowTable As Any, _ 
          ByRef pdwSize As Long, _ 
          ByVal bOrder As Long) As Long 

Private Declare Sub CopyMemory _ 
      Lib "kernel32" _ 
      Alias "RtlMoveMemory" (ByRef pDest As Any, _ 
            ByRef pSource As Any, _ 
            ByVal Length As Long) 

Private Declare Function FreeResource Lib "kernel32" (ByVal hResData As Long) As Long 

Public Property Get BytesReceived() As Long 
BytesReceived = m_lngBytesReceived 
End Property 

Public Property Get BytesSent() As Long 
    BytesSent = m_lngBytesSent 
End Property 

Public Function InitInterfaces() As Boolean 
Dim arrBuffer() As Byte 
Dim lngSize  As Long 
Dim lngRetVal As Long 
Dim Name  As String 
Dim lngRows  As Long 
Dim lngRow  As Long 
Dim i   As Integer 
Dim j   As Integer 
Dim IfRowTable As MIB_IFROW 
On Error GoTo err 

lngSize = 0 
m_lngBytesReceived = 0 
m_lngBytesSent = 0 
lngRetVal = GetIfTable(ByVal 0&, lngSize, 0) 

If lngRetVal = ERROR_NOT_SUPPORTED Then 
    Exit Function 
End If 

ReDim arrBuffer(0 To lngSize - 1) As Byte 
lngRetVal = GetIfTable(arrBuffer(0), lngSize, 0) 

If lngRetVal = ERROR_SUCCESS Then 
    CopyMemory lngRows, arrBuffer(0), 4 

    If lngRows >= 1 Then 

     For lngRow = 1 To lngRows 
      CopyMemory IfRowTable, arrBuffer(4 + (lngRow - 1) * Len(IfRowTable)), Len(IfRowTable) 

      For i = 0 To 25 
       Name = Name & Chr(IfRowTable.bDescr(i)) 

       If IfRowTable.bDescr(i) = Chr(0) Then GoTo ok 
      Next 

ok: 

      If Not InStr(1, Name, "loop", vbTextCompare) > 0 Then 

       With IfRowTable 
        m_lngBytesReceived = m_lngBytesReceived + .dwInOctets 
        m_lngBytesSent = m_lngBytesSent + .dwOutOctets 

       End With 'IFROWTABLE 

       'Set IfRowTable = Nothing 
       InitInterfaces = True 
      End If 

      Name = vbNullString 
     Next 

     Erase arrBuffer 
    End If 

End If 

On Error GoTo 0 
Exit Function 

err: 

Call GErrorHandler(err.Number, err.Description, "CIPHelper:InitInterfaces:" & err.Source, True) 
End Function 

Private Sub GetBandwidth() 
Dim c As New CIpHelper, R As Double, s As Double 
Dim r1 As Double, c1 As Double, SendBytes1 As Double, ReceivedBytes1 As Double 

    On Error GoTo errh: 
    c.InitInterfaces 
    If FirstTime Then 
     FirstTime = False 
     SendBytes = Format(c.BytesSent/1024, ".0") 
     ReceivedBytes = Format(c.BytesReceived/1024, ".0") 
     SendBytes1 = c.BytesSent 
     ReceivedBytes1 = c.BytesReceived 
    Else 'FIRSTTIME = FALSE/0 
     R = ((c.BytesReceived/1024) - ReceivedBytes) 
     s = ((c.BytesSent/1024) - SendBytes) 
    End If  


    lblBandwidthUsed = R+s 

    OldR = R 
    OldS = s 
    On Error GoTo 0 
    Exit Sub 
errh: 

    Call GErrorHandler(err.Number, err.Description, "ScreenBlock:GetBandwidth:" & err.Source, True) 
End Sub 

回答

1

1)1024個字節= 1 KB和KB 1024 = 1 MB 。換句話說,將千字節數除以1024.

2)我假設你不想監控局域網流量,你想監控無線流量。做一個通用的解決方案可能有點棘手,但是如果你知道你的局域網網卡的MAC地址,你可以將它排除在我看起來像「bPhysAddr」變量的計算中。

你可以在命令行中執行命令的PC的MAC地址:

ipconfig /all 
+0

感謝您的答覆,1)已經我這樣做計算,但如果用螢火蟲和我的應用程序的數據傳輸比較它有所不同2)沒有安裝無線設備(互聯網和LAN文件傳輸)使用相同的適配器。 – 2011-01-11 13:54:07