![](/img/trans.png)
[英]How do I associate an IP address to a network name in Windows 8 Metro
[英]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.