我知道这可能是老生常谈,但也许这可以帮助到某些人。我已经在各个地方寻找查找本地IP地址的方法,但无论哪里都说要使用:
Dns.GetHostEntry(Dns.GetHostName());
我不喜欢这个程序,因为它只是获取分配给你的计算机的所有地址。如果你有多个网络接口(现在几乎所有计算机都有),你就不知道哪个地址对应哪个网络接口。经过大量研究后,我创建了一个函数来使用NetworkInterface类并从中提取信息。这样,我就可以知道它是什么类型的接口(以太网、无线、环回、隧道等),是否处于活动状态,以及更多信息。
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
现在,要获取您的以太网网络接口的IPv4地址,请调用以下命令:
GetLocalIPv4(NetworkInterfaceType.Ethernet)
或者您的无线接口:
GetLocalIPv4(NetworkInterfaceType.Wireless80211)
如果您尝试获取无线接口的IPv4地址,但是您的计算机没有安装无线网卡,则会返回空字符串。以太网接口也是同样的情况。
编辑:(感谢
@NasBanov指出)尽管此函数提取IP地址的方式比使用“Dns.GetHostEntry(Dns.GetHostName())”要好得多,但它在支持相同类型的多个接口或单个接口上的多个IP地址方面表现不佳。当可能分配了多个地址时,它仅返回单个IP地址。要返回所有这些分配的地址,您可以简单地操作原始函数,始终返回数组而不是单个字符串。例如:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
现在这个函数将返回特定接口类型的所有分配地址。如果只需要一个字符串,可以使用
.FirstOrDefault()
扩展来返回数组中的第一个项目,如果为空,则返回空字符串。
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();