我需要从 Windows 8 WinRT / Metro 应用程序中了解我的实际本地IP地址(即不是环回地址)。我需要这几个原因。最简单的是,在应用程序的UI中,我想显示一些文本,例如“您的本地网络IP地址是:[从代码查询的IP]”。
我们还使用该地址进行一些额外的网络通信。这些通信是完全有效的,因为如果我查看控制面板中的IP地址,然后将其硬编码到应用程序中,这一切都有效。在对话框中询问用户去查看地址并手动输入它是我真正想要避免的。
我认为以编程方式获取地址并不是一项复杂的任务,但我的搜索引擎和StackOverflow技能空洞。
此时我开始考虑做一个UDP广播/监听循环来听取我自己的请求并从中提取地址,但这看起来真的像一个hackey kludge。在WinRT的新东西中是否有一个API可以让我到那里?
请注意,我说“WinRT应用。这意味着像Dns.GetHostEntry
或NetworkInterface.GetAllInterfaces()
这样的典型机制无效。
答案 0 :(得分:34)
经过大量挖掘后,我使用NetworkInformation和HostName找到了您需要的信息。
NetworkInformation.GetInternetConnectionProfile检索与本地计算机当前使用的互联网连接关联的连接配置文件。
NetworkInformation.GetHostNames检索主机名列表。这并不明显,但这包括IPv4和IPv6地址作为字符串。
使用此信息,我们可以获得连接到互联网的网络适配器的IP地址,如下所示:
public string CurrentIPAddress()
{
var icp = NetworkInformation.GetInternetConnectionProfile();
if (icp != null && icp.NetworkAdapter != null)
{
var hostname =
NetworkInformation.GetHostNames()
.SingleOrDefault(
hn =>
hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null
&& hn.IPInformation.NetworkAdapter.NetworkAdapterId
== icp.NetworkAdapter.NetworkAdapterId);
if (hostname != null)
{
// the ip address
return hostname.CanonicalName;
}
}
return string.Empty;
}
请注意HostName具有CanonicalName,DisplayName和RawName属性,但它们似乎都返回相同的字符串。
我们还可以使用与此类似的代码获取多个适配器的地址:
private IEnumerable<string> GetCurrentIpAddresses()
{
var profiles = NetworkInformation.GetConnectionProfiles().ToList();
// the Internet connection profile doesn't seem to be in the above list
profiles.Add(NetworkInformation.GetInternetConnectionProfile());
IEnumerable<HostName> hostnames =
NetworkInformation.GetHostNames().Where(h =>
h.IPInformation != null &&
h.IPInformation.NetworkAdapter != null).ToList();
return (from h in hostnames
from p in profiles
where h.IPInformation.NetworkAdapter.NetworkAdapterId ==
p.NetworkAdapter.NetworkAdapterId
select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList();
}
答案 1 :(得分:1)
关于接受的答案,您只需要:
HostName localHostName = NetworkInformation.GetHostNames().FirstOrDefault(h =>
h.IPInformation != null &&
h.IPInformation.NetworkAdapter != null);
您可以通过以下方式获取本地IP地址:
string ipAddress = localHostName.RawName; //XXX.XXX.XXX.XXX
使用的命名空间:
using System.Linq;
using Windows.Networking;
using Windows.Networking.Connectivity;