找回密码
 加入
搜索
查看: 4964|回复: 5

如何得到本机的本地网卡连接速度!

[复制链接]
发表于 2009-12-12 01:28:51 | 显示全部楼层 |阅读模式
在论坛上找了N个测试都有问题,写这样的程序主要是想用于网吧找哪些机器的网线不正常的,比如说是千M的网络,那台机器只跑到100M,说明网线有问题,作个记录,方便解决问题,但试了论坛上的几个程序,都有问题,我把网络取了,他还是1000M,明明是100M的网卡,得到的速度也是1000M,所以希望高手来指点一下啊!
发表于 2009-12-12 01:45:23 | 显示全部楼层
从注册表获取的,测试了好几种网卡,都能正常判断。

_NetworkAdapterInfo() 这个UDF我稍微改了下。最后一项就是网卡实际的速度了。
#Include <Array.au3>


$NetworkAdapterInfo = _NetworkAdapterInfo()

_ArrayDisplay($NetworkAdapterInfo, "NetworkAdapterInfo")


Func GetSpeed($ID)
        $NetKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"
        $i = 1
        While 1
                $Idx = RegEnumKey($NetKey,$i)
                If @error Then ExitLoop
                $Sid = RegRead($NetKey&""&$Idx,"NetCfgInstanceId")
                If $Sid = $ID Then
                        $P = 1
                        While 1
                                $Params = RegEnumKey($NetKey&""&$Idx&"\Ndi",$P)
                                If @error Then ExitLoop
                                If StringInStr($Params,"Params") > 0 Then
                                        $C = 1
                                        While 1
                                                $IN = RegEnumKey($NetKey&""&$Idx&"\Ndi"&$Params,$C)
                                                If @error Then ExitLoop
                                                $Mode = RegRead($NetKey&""&$Idx&"\Ndi"&$Params&""&$IN,"ParamDesc")
                                                If (StringInStr($Mode,"速度") > 0 And StringInStr($Mode,"双工") > 0) Or _
                                                (StringInStr($Mode,"speed") > 0 And StringInStr($Mode,"duplex") > 0) Or _
                                                (StringInStr($Mode,"Media") > 0 And StringInStr($Mode,"Type") > 0) Or _
                                                (StringInStr($Mode,"Connection") > 0 And StringInStr($Mode,"Type") > 0) Then
                                                        Dim $aSpeed[1]
                                                        $aSpeed[0] = 0
                                                        $X = 1
                                                        While 1
                                                                $SP = RegEnumVal($NetKey&""&$Idx&"\Ndi\params"&$IN&"\enum",$X)
                                                                If @error then ExitLoop
                                                                $SPTEMP = RegRead($NetKey&""&$Idx&"\Ndi\params"&$IN&"\enum",$SP)
                                                                $Speed = GetNo($SPTEMP)
                                                                If $Speed <> "" then
                                                                        _ArrayAdd($aSpeed, $Speed)
                                                                EndIf
                                                                $X = $X + 1
                                                        WEnd
                                                        Return _ArrayMax($aSpeed)
                                                EndIf
                                                $C = $C + 1
                                        WEnd
                                EndIf
                                $P = $P + 1
                        WEnd
                EndIf
                $i = $i + 1
        WEnd
        Return 0
EndFunc

Func GetNo($ZHI)
        $Exp = StringRegExp($ZHI, "\d+.\d+|\d+", 1)
        If Not @error Then
                If StringInStr($Exp[0],".") > 0 then
                        Return $Exp[0] * 1000
                Else
                        Return $Exp[0]
                EndIf
        Else
                Return ""
        EndIf
EndFunc

Func _NetworkAdapterInfo()
        ;======================================================
        ;
        ; 函数名称:        _NetworkAdapterInfo()
        ; 详细信息:        获取系统所有网卡信息
        ; 返回值说明:
        ; 以二维数组方式返回.例如 $info=_NetworkAdapterInfo()
        ; $info[0][0] 网卡数量
        ; $info[1][0] 第一块网卡的标志1
        ; $info[1][1] 第一块网卡的状态
        ; 状态说明:7为网卡未插网线,2为网卡连接正常
        ; $info[1][2] 第一块网卡的网卡名称
        ; $info[1][3] 第一块网卡的连接名称
        ; $info[1][4] 第一块网卡的MAC地址
        ; $info[1][5] 第一块网卡的IP地址
        ; $info[1][6] 第一块网卡的最高速度
        ; 第二块网卡:
        ; $info[2][0] 第二块网卡的标志1
        ; $info[2][6] 第二块网卡的最高速度
        ; 其他网卡信息依次类推。。。
        ; 注意,此UDF不会获取已经禁用的网卡。
        
        ; 作者:      Sanhen (gxbeiliu@163.com)
        ; 网站: www.lunhui.net.cn  www.autoitx.com
        ;======================================================
        Local $colItem
        Local $objItem
        Local $colItems
        Local $objItems
        Local $objWMIService
        Local $Adapters[1][8]
        $Adapters[0][0] = 0
        $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
        $colItem = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus >0", "WQL", 0x30)
        If IsObj($colItem) Then
                For $objItem In $colItem
                        If $objItem.MACAddress = "00:00:00:00:00:00" Then ContinueLoop
                        $Adapters[0][0] += 1
                        ReDim $Adapters[UBound($Adapters) + 1][8]
                        $Adapters[$Adapters[0][0]][0] += $Adapters[0][0]
                        $Adapters[$Adapters[0][0]][1] = $objItem.NetConnectionStatus
                        $Adapters[$Adapters[0][0]][2] = $objItem.Description
                        $Adapters[$Adapters[0][0]][3] = $objItem.NetConnectionID
                        $Adapters[$Adapters[0][0]][4] = $objItem.MACAddress
                        $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress = "' & $Adapters[$Adapters[0][0]][4] & '" And IPEnabled = True ', "WQL", 0x30)
                        If IsObj($colItems) Then
                                For $objItems In $colItems
                                        ;if $objItem1.IPAddress(0) = "0.0.0.0" Then ContinueLoop
                                        $Adapters[$Adapters[0][0]][5] = $objItems.IPAddress(0)
                                        $Adapters[$Adapters[0][0]][6] = $objItems.SettingID
                                        $Adapters[$Adapters[0][0]][7] = GetSpeed($objItems.SettingID)
                                Next
                        EndIf
                Next
        EndIf

        Return $Adapters

EndFunc   ;==>_NetworkAdapterInfo
发表于 2009-12-12 01:46:50 | 显示全部楼层
再发一个给你试试。
#Include <Array.au3>

$NetKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"

$i = 1
While 1
        $ID = RegEnumKey($NetKey,$i)
        If @error <> 0 then ExitLoop
        $o = 1
        While 1
                $IN = RegEnumKey($NetKey&""&$ID&"\Ndi\params",$o)
                If @error <> 0 then ExitLoop
                $Mode = RegRead($NetKey&""&$ID&"\Ndi\params"&$IN,"ParamDesc")
                If (StringInStr($Mode,"速度") > 0 And StringInStr($Mode,"双工") > 0) Or _
                        (StringInStr($Mode,"speed") > 0 And StringInStr($Mode,"duplex") > 0) Or _
                        (StringInStr($Mode,"Media") > 0 And StringInStr($Mode,"Type") > 0) Or _
                        (StringInStr($Mode,"Connection") > 0 And StringInStr($Mode,"Type") > 0) Then
                        Dim $aSpeed[3]
                        $aSpeed[0] = RegRead($NetKey&""&$ID,"DriverDesc")
                        $Sid = RegRead($NetKey&""&$ID,"NetCfgInstanceId")
                        $Name = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"&$Sid&"\Connection","Name")
                        $aSpeed[1] = $Name
                        $aSpeed[2] = 0
                        $x = 1
                        While 1
                                $SP = RegEnumVal($NetKey&""&$ID&"\Ndi\params"&$IN&"\enum",$x)
                                If @error then ExitLoop
                                $SPTEMP = RegRead($NetKey&""&$ID&"\Ndi\params"&$IN&"\enum",$SP)
                                $Speed = GetNo($SPTEMP)
                                If $Speed <> "" then
                                        _ArrayAdd($aSpeed, $Speed)
                                EndIf
                                $x = $x + 1
                        WEnd
                        MsgBox(0,"",$aSpeed[0]&@CR&$aSpeed[1]&": "&_ArrayMax($aSpeed,2)&" M")
                        ;_ArrayDisplay($aSpeed, "")
                EndIf
                $o = $o + 1
        WEnd
        $i = $i + 1
WEnd

Func GetNo($ZHI)
        $Exp = StringRegExp($ZHI, "\d+.\d+|\d+", 1)
        If Not @error Then
                If StringInStr($Exp[0],".") > 0 then
                        Return $Exp[0] * 1000
                Else
                        Return $Exp[0]
                EndIf
        Else
                Return ""
        EndIf
EndFunc
发表于 2009-12-12 08:25:51 | 显示全部楼层
又当前的下载速度没,呵呵
发表于 2009-12-12 13:12:35 | 显示全部楼层
先做记号,指不定什么时候用得上。。
发表于 2009-12-13 22:50:39 | 显示全部楼层
做记号,说不定什么时候用得上。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 14:36 , Processed in 0.080089 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表