1

我需要获取用户连接到的所有网络名称的列表以及该网络上计算机的 IP 地址。我可以使用 NetworkInformation.GetConnectionProfiles() 获取网络名称列表,并且可以使用 NetworkInformation.GetHostNames() 获取 IP 地址列表,但我无法弄清楚如何关联这两个列表。我认为这将是通过 NetworkAdapters 但两个不同调用之间的 ID 不同。

有谁知道如何做到这一点?

更新:为了澄清,我问的是如何在 Windows 8 上的 Metro 应用程序中执行此操作。

更新 2:事实证明这是 Release Preview 中的一个错误。现在我们已经切换到 RTM,一切正常,无需对现有代码进行任何更改。

4

2 回答 2

1

编辑:刚刚发现这个......查询本地IP地址 看起来像一个更干净的方式。任你选...

我会采取刺伤... 希望能让你接近。我只有一个适配器连接在我的测试机器上,但我认为(希望)这可以在具有多个适配器的机器上工作。

// Get all profiles
var profiles = NetworkInformation.GetConnectionProfiles();

// filter out profiles that are not currently online 
var connected = from p in profiles where p.GetNetworkConnectivityLevel() != NetworkConnectivityLevel.None select p;

// find all hosts
var hosts = NetworkInformation.GetHostNames();

// find hosts that have an IP Address
var online = from h in hosts where h.IPInformation != null select h;

// Now loop there each online connection and match network adapter ids with hosts
foreach (var c in connected)
{
   var matches = from o in online where o.IPInformation.NetworkAdapter.NetworkAdapterId == c.NetworkAdapter.NetworkAdapterId select o;
}

这里唯一的问题是,一个物理适配器实际上会显示一次它的 IPv4 地址,一次显示它的 IPv6 地址。您将不得不采取额外的步骤并将它们关联在一起。希望这是您正在寻找的。

于 2012-08-31T00:04:45.653 回答
0

好吧,我不了解 c# 或 .net 框架,但是从 windows 命令提示符下,命令 netstat -f 是您所需要的。也许你可以解析一下。

更新

我想我明白你需要什么。如果您有 IP 地址列表,则可以使用 Dns.GetHostEntry 将它们转换为主机名

看看这篇文章,它讨论了 C# 中的问题。

于 2012-08-30T20:22:17.160 回答