c#获取本机在局域网ip地址的二种方法


在C#中,获取本机在局域网(LAN)中的IP地址通常可以通过检查网络接口来实现。这里提供两种常见的方法来实现这一功能。

### 方法一:使用`Dns.GetHostEntry` 和 `NetworkInterface`

这个方法结合使用了`System.Net`和`System.Net.NetworkInformation`命名空间中的类。首先,通过`Dns.GetHostEntry`获取本机的主机信息,然后遍历网络接口以找到IPv4地址(通常局域网地址)。


using System;
using System.Net;
using System.Net.NetworkInformation;

public class LocalIPAddressFinder
{
    public static void Main()
    {
        foreach (var ip in GetLocalIPv4())
        {
            Console.WriteLine(ip);
        }
    }

    public static string[] GetLocalIPv4()
    {
        var host = Dns.GetHostEntry(Dns.GetHostName());
        var ipAddresses = new List<string>();

        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            {
                ipAddresses.Add(ip.ToString());
            }
        }

        // 通常情况下,这里返回的IP地址列表包含了所有IPv4地址,包括局域网和公网地址(如果有的话)
        // 如果需要进一步区分局域网地址,可能需要根据子网掩码进行过滤,但这里仅作为获取IPv4地址的示例

        return ipAddresses.ToArray();
    }
}

// 注意:这个方法可能会返回多个IP地址,包括公网地址(如果有的话)。
// 过滤出局域网地址可能需要额外的逻辑,比如检查子网掩码等。

### 方法二:直接使用`NetworkInterface`

如果你只需要局域网(即内部网络)的IP地址,并且希望避免`Dns.GetHostEntry`可能返回的公网地址,可以直接使用`NetworkInterface`类来枚举网络接口和它们的IP配置。


using System;
using System.Net.NetworkInformation;

public class LocalLANIPAddressFinder
{
    public static void Main()
    {
        foreach (var ip in GetLocalLANIPv4())
        {
            Console.WriteLine(ip);
        }
    }

    public static string[] GetLocalLANIPv4()
    {
        var ipAddresses = new List<string>();

        foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
        {
            if (networkInterface.OperationalStatus == OperationalStatus.Up &&
                networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback)
            {
                foreach (var ipInfo in networkInterface.GetIPProperties().UnicastAddresses)
                {
                    if (ipInfo.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        ipAddresses.Add(ipInfo.Address.ToString());
                    }
                }
            }
        }

        return ipAddresses.ToArray();
    }
}

// 这个方法直接检查每个网络接口,并返回所有活动的、非回环的IPv4地址。
// 这通常能更准确地反映局域网中的IP地址。

两种方法各有优势,第一种方法简单直接,但可能包含非局域网地址;第二种方法更加精确,但实现起来稍微复杂一些。