我知道这可能会踢死人,但这也许可以帮助某人。我到处寻找可以找到我本地IP地址的方法,但是在我发现它可以使用的任何地方:
Dns.GetHostEntry(Dns.GetHostName());
我根本不喜欢这样,因为它只是获取分配给您计算机的所有地址。如果您有多个网络接口(如今几乎所有计算机都使用该接口),则您不知道哪个地址与哪个网络接口一起使用。经过大量研究后,我创建了一个使用NetworkInterface类的函数,并从中提取信息。通过这种方式,我可以分辨出它是什么类型的接口(以太网,无线,环回,隧道等),它是否处于活动状态以及SOOO等等。
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),尽管此功能将以比使用Dns.GetHostEntry(Dns.GetHostName())
它更好的方式提取IP地址,但在支持相同类型的多个接口或单个接口上的多个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();
If I am not connected to a network and I am connected to the internet
这种说法似乎是矛盾的。您是否要确定您的计算机是连接到专用LAN还是Internet?