如何在Win 10 UWP项目中找到本地IP地址

Dan*_*ome 8 c# ip uwp

我目前正在尝试将管理控制台应用程序移植到Win 10 UWP应用程序.我在使用以下控制台代码中的System.Net.Dns时遇到问题.

如何获取设备IP

这是我试图移植的控制台应用程序代码.

public static string GetIP4Address()
{
    string IP4Address = String.Empty;
    foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
    {
        if (IPA.AddressFamily == AddressFamily.InterNetwork)
        {
            IP4Address = IPA.ToString();
            break;
        }
    }
    return IP4Address;
}
Run Code Online (Sandbox Code Playgroud)

pan*_*nda 13

使用它来获取UWP应用程序中的主机IP地址,我测试过它:

    foreach (HostName localHostName in NetworkInformation.GetHostNames())
    {
        if (localHostName.IPInformation != null)
        {
            if (localHostName.Type == HostNameType.Ipv4)
            {
                textblock.Text = localHostName.ToString();
                break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

并在此处查看API文档


Joh*_*ang 11

你可以尝试这样:

private string GetLocalIp()
{
    var icp = NetworkInformation.GetInternetConnectionProfile();

    if (icp?.NetworkAdapter == null) return null;
    var hostname =
        NetworkInformation.GetHostNames()
            .SingleOrDefault(
                hn =>
                    hn.IPInformation?.NetworkAdapter != null && hn.IPInformation.NetworkAdapter.NetworkAdapterId
                    == icp.NetworkAdapter.NetworkAdapterId);

    // the ip address
    return hostname?.CanonicalName;
}
Run Code Online (Sandbox Code Playgroud)

上面的答案也是对的

  • 抛出LINQ异常 - 在我的情况下,序列包含多个匹配元素(正如我在其他注释中所写的,我在我的适配器列表中也有VirtualBox设置的虚拟交换机).我将它更改为FirstOrDefault而不是SingleOrDefault来绕过它,它返回了Ipv6地址.请参阅我的答案以获得修复以获得Ipv4 (3认同)

Geo*_*lis 5

基于@John Zhang 的回答,但修复了不抛出有关多个匹配项的 LINQ 错误并返回 Ipv4 地址的问题:

   public static string GetFirstLocalIp(HostNameType hostNameType = HostNameType.Ipv4)
    {
        var icp = NetworkInformation.GetInternetConnectionProfile();

        if (icp?.NetworkAdapter == null) return null;
        var hostname =
            NetworkInformation.GetHostNames()
                .FirstOrDefault(
                    hn =>
                        hn.Type == hostNameType &&
                        hn.IPInformation?.NetworkAdapter != null && 
                        hn.IPInformation.NetworkAdapter.NetworkAdapterId == icp.NetworkAdapter.NetworkAdapterId);

        // the ip address
        return hostname?.CanonicalName;
    }
Run Code Online (Sandbox Code Playgroud)

显然,您可以传递 HostNameType.Ipv6 而不是 Ipv4,这是获取 Ipv6 地址的默认(隐式)参数值