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