如何确定本地主机的IPv4地址?

如何从Dns.GetHostAddresses()仅获取Internet协议版本4地址? 我有下面的代码,它给了我IPv4和IPv6地址。 我必须使用具有多个IPv4地址的盒子。

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); private void get_IPs() { foreach (IPAddress a in localIPs) { server_ip = server_ip + a.ToString() + "/"; } } 

在你的代码中添加这样的东西

  if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork ) // IPv4 address 

从我的博客 :

 ///  /// This utility function displays all the IP (v4, not v6) addresses of the local computer. ///  public static void DisplayIPAddresses() { StringBuilder sb = new StringBuilder(); // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface network in networkInterfaces) { // Read the IP configuration for each network IPInterfaceProperties properties = network.GetIPProperties(); // Each network interface may have multiple IP addresses foreach (IPAddressInformation address in properties.UnicastAddresses) { // We're only interested in IPv4 addresses for now if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue; // Ignore loopback addresses (eg, 127.0.0.1) if (IPAddress.IsLoopback(address.Address)) continue; sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")"); } } MessageBox.Show(sb.ToString()); } 

特别是,我推荐Dns.GetHostAddresses(Dns.GetHostName()); ,无论这条线在各种文章和博客上有多受欢迎。

这是我使用的一个function:

 public static string GetIP4Address() { string IP4Address = String.Empty; foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) { if (IPA.AddressFamily == AddressFamily.InterNetwork) { IP4Address = IPA.ToString(); break; } } return IP4Address; } 

作为一个可枚举的:

 public static IEnumerable GetIP4Addresses() { return Dns.GetHostAddresses(Dns.GetHostName()) .Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork) .Select(x => x.ToString()); } 

使用Linq时非常干净和甜美

 IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray(); 

locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)

来自DNS.GetHostAddresses上的MSDN ,

当空字符串作为主机名传递时,此方法返回除Windows Server 2003之外的所有操作系统的本地主机的IPv4地址。 对于Windows Server 2003,将返回本地主机的IPv4和IPv6地址。

如果本地计算机未安装IPv6,则会从GetHostAddresses方法的结果中过滤IPv6地址。 因此,如果只有IPv6结果可用于hostNameOrAddress.parameter,则可以返回空的IPAddress实例。

因此,您可以使用它来尝试解析它 :

 IPAddress.TryParse 

然后检查AddressFamily哪个

返回IPv4的System.Net.Sockets.AddressFamily.InterNetwork或IPv6的System.Net.Sockets.AddressFamily.InterNetworkV6。

 string input = "192.168.0.10"; IPAddress address; if (IPAddress.TryParse(input, out address)) { switch (address.AddressFamily) { case System.Net.Sockets.AddressFamily.InterNetwork: // we have IPv4 break; case System.Net.Sockets.AddressFamily.InterNetworkV6: // we have IPv6 break; default: // do something else break; } } 

我用了开头的答案

 ///  and it mostly worked: //for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork if (address.Address.AddressFamily != AddressFamily.InterNetwork) 

我不得不使用:

 if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) 

但我实际使用过:

 if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork)) 

另外,我补充说:

 if (network.OperationalStatus != OperationalStatus.Up) continue; 

因为有些网络不起作用而且不应该在那里,我确实看到它们在注册表中。 —阿尔文

我使用这个帮助方法,在过滤掉IPV6和Loopback一次后返回第一个活动的IPV4地址

 public static IPAddress GetLocalIPAddress() { IPAddress result = null; IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName()); IPAddress[] ipv4Address = Array.FindAll(iphostentry.AddressList, add => add.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(add)); if (ipv4Address.Length > 0 ) { result =ipv4Address[0]; } return result; } 

对我来说,更清洁的解决方案是:

  public static string GetLocalIP() { string ipv4Address = String.Empty; foreach (IPAddress currentIPAddress in Dns.GetHostAddresses(Dns.GetHostName())) { if (currentIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { ipv4Address = currentIPAddress.ToString(); break; } } return ipv4Address; } 

这是我的代码。 并且可以在许多LAN卡上找到它。

 private string GetLocalIpAddress() { string localIpAddress = string.Empty; NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface nic in nics) { if (nic.OperationalStatus != OperationalStatus.Up) { continue; } IPv4InterfaceStatistics adapterStat = (nic).GetIPv4Statistics(); UnicastIPAddressInformationCollection uniCast = (nic).GetIPProperties().UnicastAddresses; if (uniCast != null) { foreach (UnicastIPAddressInformation uni in uniCast) { if (adapterStat.UnicastPacketsReceived > 0 && adapterStat.UnicastPacketsSent > 0 && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback) { if (uni.Address.AddressFamily == AddressFamily.InterNetwork) { localIpAddress = nic.GetIPProperties().UnicastAddresses[0].Address.ToString(); break; } } } } } return localIpAddress; }