繁体   English   中英

如何获得Windows网络选项卡中显示的路由器名称和IP? (在代码中)

[英]How to get Router Name & IP as shown in Windows Network Tab? (in Code)

基本上,如果转到“开始”并单击“计算机”,然后单击左侧的“网络”链接,您会在右侧看到几个类别,其中一个类别为“网络基础结构”,在该类别中,列出了路由器,在我的情况下,它是"LINKSYS WAG160N Wireless-N ADSL2+ Gateway" ,右键单击并选择属性时,它列出了诸如内部/网关IP地址之类的基本信息,而在我看来,它是"192.168.1.1"

我想知道如何在代码中检索此信息,最好是Windows API,以便我可以使用旧版VB6应用程序调用它。 另外,即使您只知道.NET版本或Delphi版本,也请列出并在其中进行编码。 但是,我最终寻求的答案是通过VB6访问此方法的方法,因此可能是WinAPI调用(将投票并选择它作为答案),但是,如果我找不到旧版方法,也可以使用其他方法方法(我会投票赞成)。

多谢你们 :)

您可以尝试捕获“ route print -4”命令的输出并将其解析为默认路由。 如果使用的是IPv6,则将-4更改为-6。

需要的代码比我想要的多。 如果有更紧凑的方法,我会对自己感兴趣。

据我了解,Windows通过UPnP获取信息。 UPnP充当一种基于UDP的Web服务。 它具有怪癖,因为它使用UDP多播,因此很难进行显式编码,但是Windows提供了一个帮助程序库。 这个库不能很好地“包装”成VB6程序,但是通过一些技巧,您可以访问其大多数功能。

编写以下示例,以便可以在Win XP以及更高版本的Windows上进行编译。 库的Win XP版本缺少关键的typelib信息,该信息阻止VB6使用其提供的所有功能。 在Vista中,此问题已得到纠正,但是对于此应用程序,我们不需要其提供的完整回调功能。 如果需要完全访问权限,则可以使用外部typelib,或者可以在Vista或更高版本上进行编译。 在Vista上编译的程序可以在XP上正常工作。

下面的代码是从VB6服务器中用于UPnP NAT端口映射的较大类中提取的。 该子集可能会满足您的要求。

UPnPNAT.cls

Option Explicit
'Requires reference to:
'
'   UPnP 1.0 Type Library (Control Point)
'

Private Const CONN_SVCTYPEID_URI As String = "urn:schemas-upnp-org:service:WANIPConnection:1"
Private Const CONN_ID_URI As String = "urn:upnp-org:serviceId:WANIPConn1"

Private UDFinder As UPNPLib.UPnPDeviceFinder
Private WithEvents UNCBs As UPnPNATCBs
Private findData As Long
Private blnSuccess As Boolean

Public Event Result(ByVal Success As Boolean, ByVal FriendlyName As String, ByVal IP As String)

Public Sub Fetch()
    blnSuccess = False
    Set UDFinder = New UPNPLib.UPnPDeviceFinder
    Set UNCBs = New UPnPNATCBs
    findData = CallByName(UDFinder, "CreateAsyncFind", VbMethod, CONN_SVCTYPEID_URI, 0, UNCBs)
    UDFinder.StartAsyncFind findData
End Sub

Private Sub UNCBs_DeviceAdded(ByVal Device As UPNPLib.IUPnPDevice)
    Dim Services As UPNPLib.UPnPServices
    Dim Service As UPNPLib.UPnPService
    Dim varInActionArgs, varOutActionArgs
    Dim strFriendlyName As String
    Dim strIP As String

    strFriendlyName = Device.FriendlyName
    On Error Resume Next
    Set Services = Device.Services
    If Err.Number = 0 Then
        On Error GoTo 0
        With Services
            If .Count > 0 Then
                On Error Resume Next
                Set Service = .Item(CONN_ID_URI)
                If Err.Number = 0 Then
                    On Error GoTo 0
                    ReDim varInActionArgs(0 To 0)
                    ReDim varOutActionArgs(0 To 0)
                    Service.InvokeAction "GetExternalIPAddress", _
                                         varInActionArgs, _
                                         varOutActionArgs
                    strIP = varOutActionArgs(0)
                    blnSuccess = True
                Else
                    On Error GoTo 0
                End If
            End If
        End With
    Else
        On Error GoTo 0
    End If

    UDFinder.CancelAsyncFind findData
    RaiseEvent Result(blnSuccess, strFriendlyName, strIP)
    Set UDFinder = Nothing
    Set UNCBs = Nothing
End Sub

Private Sub UNCBs_SearchComplete()
    If Not blnSuccess Then
        RaiseEvent Result(False, "", "")
    End If
End Sub

UPnPNATCBs.cls

Option Explicit

Public Event DeviceAdded(ByVal Device As UPNPLib.IUPnPDevice)
Public Event DeviceRemoved(ByVal UDN As String)
Public Event SearchComplete()

Public Sub IDispatchCallback( _
    ByVal pDevice As Variant, _
    ByVal bstrUDN As Variant, _
    ByVal lType As Variant)
    'NOTE: Must be dispID = 0, i.e. the default method of the class.

    Select Case lType
        Case 0
            RaiseEvent DeviceAdded(pDevice)
        Case 1
            RaiseEvent DeviceRemoved(bstrUDN)
        Case 2
            RaiseEvent SearchComplete
    End Select
End Sub

Form1.frm

Option Explicit

Private WithEvents UN As UPnPNAT

Private Sub Form_Load()
    Set UN = New UPnPNAT
    lblStatus.Caption = "Searching..."
    UN.Fetch
End Sub

Private Sub UN_Result(ByVal Success As Boolean, ByVal FriendlyName As String, ByVal IP As String)
    If Success Then
        lblStatus.Caption = FriendlyName & " " & IP
    Else
        lblStatus.Caption = "Failed"
    End If
End Sub

如果您有多个在网络中提供连接的UPnP设备,则可能需要对此进行一些调整。

if (!NetworkInterface.GetIsNetworkAvailable())
    return "Not connected.";

var networkDevices = NetworkInterface.GetAllNetworkInterfaces();
if (networkDevices.Length == 0)
    return "No network devices.";

networkDevices = networkDevices
    .Where(n => n.OperationalStatus == OperationalStatus.Up
        || n.OperationalStatus == OperationalStatus.Dormant)
    .ToArray();
if (networkDevices.Length == 0)
    return "Network not connected.";

networkDevices = networkDevices
    .Where(n => n.Supports(NetworkInterfaceComponent.IPv4))
    .ToArray();
if (networkDevices.Length == 0)
    return "No IPv4 network found.";

var router = networkDevices.First().GetIPProperties()
    .GatewayAddresses.First();

var routerIp = router.Address.ToString();

连接到网页http:[ip]。 该网页的标题作为设备名称(设备型号)。 这适用于显示登录页面的设备。 如果设备希望通过请求获取用户名和密码,则会发生WebException,并且您可以读取WebException.Response.Headers [“ WWW-Authenticate”],其中包含字符串:Basic realm =“ X”,其中X是描述设备的字符串。

        private string GetDeviceName(string ip)
    {
        WebClient myWebClient = new WebClient(1000);
        try
        {
            System.IO.Stream s = myWebClient.OpenRead("http://" + ip);
            var sr = new System.IO.StreamReader(s);
            while (!sr.EndOfStream)
            {
                var L = sr.ReadLine();
                var sb = new StringBuilder();
                var st = 0;
                var end = 0;
                if ((st = L.ToLower().IndexOf("<title>")) != -1)
                {
                    sb.Append(L);
                    while ((end = L.ToLower().IndexOf("</title>")) == -1)
                    {
                        L = sr.ReadLine();
                        sb.Append(L);
                    }
                    sr.Close();
                    s.Close();
                    myWebClient.Dispose();
                    var title = sb.ToString().Substring(st + 7, end - st - 7);
                    Regex r = new Regex("&#[^;]+;");
                    title = r.Replace(title, delegate (Match match)
                    {
                        string value = match.Value.ToString().Replace("&#", "").Replace(";", "");
                        int asciiCode;
                        if (int.TryParse(value, out asciiCode))
                            return Convert.ToChar(asciiCode).ToString();
                        else
                            return value;
                    });
                    return $"Router/AP ({title})";
                }
            }
            sr.Close();
            s.Close();
            myWebClient.Dispose();
        }
        catch (System.Net.WebException ex)
        {
            var response = ex.Response as HttpWebResponse;
            if (response == null)
                return "";

            var name = response.Headers?["WWW-Authenticate"]?.Substring(12).Trim('"');
            myWebClient.Dispose();
            return name;
        }
        return "";
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM