//Returns an IP Address based on version requested
private string GetIPAddress(int version)
{
string address = null;
var IPAddressHashSet = new HashSet<IPAddress>(Dns.GetHostAddresses(GetHostName()));
switch (version)
{
case 4:
//Assign ipv4 address as string to "address"
break;
case 6:
//Assign ipv4 address as string to "address"
break;
default:
address = null;
break;
}
return address;
}
正如您所看到的,我创建了一个名为&#34; IPAddressHashSet&#34;
的HashSet根据请求的IP版本,我想返回本地ipv4或ipv6地址。
我认为我可以通过在HashSet中获取每个IP地址并进行比较来查看它是否适合某个帧(即&#34; {0:###。###。###。 ###}&#34;)但即便如此,也无法确定该地址是本地地址,外部地址,网络设备等。
在这种情况下,我只是在寻找一个基本的&#34; 192.168.0。###&#34;,但即使这样也行不通,因为并非所有默认网关都以192.168开头。
是否有任何.NET类对此有用? 基本上我想确定IP地址的版本,并在其默认网关上返回当前机器的本地地址。
答案 0 :(得分:1)
您可以使用IPAddress.Family
。它的IPv4为InterNetwork
,IPv6为InterNetworkV6
。如果要过滤掉外部ips - 请使用示例代码检查此answer,说明如何检测ip是否属于私有范围。示例代码:
private IPAddress GetFirstPrivateIp(bool ipV4) {
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
return interfaces
.SelectMany(c => c.GetIPProperties().UnicastAddresses)
.Where(c =>
!IPAddress.IsLoopback(c.Address)
&& c.Address.AddressFamily == (ipV4 ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6)
&& (!ipV4 || IpIsPrivate(c.Address))) // IpIsPrivate - refer to question linked above
.Select(c => c.Address)
.FirstOrDefault();
}