vb.net 第二节 获取MIB-II 接口表 GetIfTable

Posted VB.Net

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb.net 第二节 获取MIB-II 接口表 GetIfTable相关的知识,希望对你有一定的参考价值。

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

第二节 获取MIB-II 接口表 GetIfTable

Imports System.Runtime.InteropServices


Public Class Form2


    'Private Structure MIB_IFTABLE
    '    Dim dwNumEntries As Long            '当前网络接口的总数
    '    Dim MIB_Table(9) As MIB_IFROW         '指向一个包含MIB_IFROW类型的指针
    'End Structure

    'Private Structure MIB_IFROW
    '    Dim wszName(0 To 511) As Byte '接口名称的Unicode字符串,必须为512字节
    '    Dim dwIndex As Long         '接口编号
    '    Dim dwType As Long          '接口类型,参看IP_ADAPTER_INFO类型的Type成员
    '    Dim dwMtu As Long           '最大传输单元
    '    Dim dwSpeed As Long          '接口速度(字节)
    '    Dim dwPhysAddrLen As Long   '由bPhysAddr获得的物理地址有效长度       
    '    Dim bPhysAddr(0 To 7) As Byte '物理地址
    '    Dim dwAdminStatus As Long     '接口管理状态
    '    Dim dwOperStatus As Long            '操作状态,以下值之一:
    '    Dim dwLastChange As Long    '操作状态最后改变的时间
    '    Dim dwInOctets As Long        '总共收到(字节)
    '    Dim dwInUcastPkts As Long     '总共收到(unicast包)
    '    Dim dwInNUcastPkts As Long    '总共收到(non-unicast包),包括广播包和多点传送包
    '    Dim dwInDiscards As Long     '收到后丢弃包总数(即使没有错误)
    '    Dim dwInErrors As Long        '收到出错包总数
    '    Dim dwInUnknownProtos As Long   '收到后因协议不明而丢弃的包总数
    '    Dim dwOutOctets As Long       '总共发送(字节)
    '    Dim dwOutUcastPkts As Long    '总共发送(unicast包)
    '    Dim dwOutNUcastPkts As Long '总共发送(non-unicast包),包括广播包和多点传送包
    '    Dim dwOutDiscards As Long     '发送丢弃包总数(即使没有错误)
    '    Dim dwOutErrors As Long       '发送出错包总数
    '    Dim dwOutQLen As Long      '发送队列长度
    '    Dim dwDescrLen As Long       ' bDescr部分有效长度
    '    Dim bDescr(0 To 255) As Byte  '接口描述
    'End Structure

    Private Structure MIB_IFTABLE
        Dim dwNumEntries As Integer     '当前网络接口的总数
        Dim MIB_Table As IntPtr         '指向一个包含MIB_IFROW类型的指针
    End Structure

    <StructLayout(LayoutKind.Sequential)>
    Public Structure MIB_IFROW
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> Public wszName() As Byte           '接口名称的Unicode字符串,必须为512字节
        'Public wszName As IntPtr
        Public dwIndex As Integer         '接口编号
        Public dwType As Integer          '接口类型,参看IP_ADAPTER_INFO类型的Type成员
        Public dwMtu As Integer           '最大传输单元
        Public dwSpeed As Integer          '接口速度(字节)
        Public dwPhysAddrLen As Integer   '由bPhysAddr获得的物理地址有效长度       
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public bPhysAddr() As Byte         '物理地址
        'Public bPhysAddr As IntPtr         '物理地址
        Public dwAdminStatus As Integer     '接口管理状态
        Public dwOperStatus As Integer            '操作状态,以下值之一:
        Public dwLastChange As Integer    '操作状态最后改变的时间
        Public dwInOctets As Integer        '总共收到(字节)
        Public dwInUcastPkts As Integer     '总共收到(unicast包)
        Public dwInNUcastPkts As Integer    '总共收到(non-unicast包),包括广播包和多点传送包
        Public dwInDiscards As Integer     '收到后丢弃包总数(即使没有错误)
        Public dwInErrors As Integer        '收到出错包总数
        Public dwInUnknownProtos As Integer   '收到后因协议不明而丢弃的包总数
        Public dwOutOctets As Integer       '总共发送(字节)
        Public dwOutUcastPkts As Integer    '总共发送(unicast包)
        Public dwOutNUcastPkts As Integer '总共发送(non-unicast包),包括广播包和多点传送包
        Public dwOutDiscards As Integer     '发送丢弃包总数(即使没有错误)
        Public dwOutErrors As Integer       '发送出错包总数
        Public dwOutQLen As Integer      '发送队列长度
        Public dwDescrLen As Integer       ' bDescr部分有效长度
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public bDescr() As Byte            '接口描述
        'Public bDescr As IntPtr            '接口描述
    End Structure

    'Private Declare Function GetIfTable Lib "iphlpapi.dll" (ByRef pIfTable As MIB_IFTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
    Private Declare Function GetIfTable Lib "iphlpapi.dll" (ByRef pIfTable As IntPtr, ByRef pdwSize As Integer, ByVal bOrder As Integer) As Integer
    Private Declare Function GetIfTable Lib "iphlpapi.dll" (ByVal pIfTable() As Byte, ByRef pdwSize As Integer, ByVal bOrder As Integer) As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim MIBift As New MIB_IFTABLE

        Dim ptrMibf As IntPtr = IntPtr.Zero
        Dim lenIft As Integer

        Dim returnValue As Integer
        '第一次调用,返回122:ERROR_INSUFFICIENT_BUFFER,缓冲区大小不足
        'pdwSize参数返回实际需要的字节大小
        returnValue = GetIfTable(ptrMibf, lenIft, True)

        Dim bufferMibIft(lenIft - 1) As Byte
        '分配内存
        'ptrMibf = Marshal.AllocHGlobal(lenIft)

        '第二次调用获得数据
        returnValue = GetIfTable(bufferMibIft, lenIft, True)

        Dim bytesNumEntries(3) As Byte
        Array.Copy(bufferMibIft, 0, bytesNumEntries, 0, 4)
        Dim size As Integer = Marshal.SizeOf(bytesNumEntries(0)) * bytesNumEntries.Length
        Dim ptrNumEntries As IntPtr = Marshal.AllocHGlobal(size)
        Marshal.Copy(bytesNumEntries, 0, ptrNumEntries, 4)
        Dim NumEntries As Integer
        NumEntries = Marshal.ReadInt32(ptrNumEntries)

        Dim MIBifr As MIB_IFROW
        Dim sizeMIBifr As Integer = Marshal.SizeOf(MIBifr)

        For i As Integer = 0 To NumEntries - 1
            Dim ptrMibifr As New IntPtr
            ptrMibifr = Marshal.AllocHGlobal(sizeMIBifr)
            Marshal.Copy(bufferMibIft, 4 + sizeMIBifr * i, ptrMibifr, sizeMIBifr)
            MIBifr = Marshal.PtrToStructure(ptrMibifr, GetType(MIB_IFROW))

            Dim wszname As String
            Dim bDescr As String
            Dim mac As String
            wszname = System.Text.Encoding.Default.GetString(MIBifr.wszName).Replace(vbNullChar, "")
            TextBox1.Text &= wszname & vbCrLf
            bDescr = System.Text.Encoding.Default.GetString(MIBifr.bDescr).Substring(0, MIBifr.dwDescrLen - 1)
            TextBox1.Text &= bDescr & vbCrLf
            '直接使用BitConverter的ToString方法
            mac = BitConverter.ToString(MIBifr.bPhysAddr, 0, 6)
            TextBox1.Text &= mac & vbCrLf
        Next


    End Sub

End Class

 

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看 vb.net 教程 目录

以上是关于vb.net 第二节 获取MIB-II 接口表 GetIfTable的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 第十六节 获取本机IP 路由表 GetIpForwardTable

vb.net获取excel页面高度

vb.net如何动态调用WebService接口啊

如何获取表中的最后一个自动增量值? VB.NET

vb.net listview中一行数据的提取

第二节:创建模型,使用Code First,配置映射关系