Comment obtenir uniquement les adresses Internet Protocol version 4 à partir de Dns.GetHostAddresses()
? J'ai le code ci-dessous et il me donne les adresses IPv4 et IPv6 ..__ Je dois le faire fonctionner avec des boîtes qui ont plusieurs adresses IPv4.
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
{
foreach (IPAddress a in localIPs)
{
server_ip = server_ip + a.ToString() + "/";
}
}
ajouter quelque chose comme ça à votre code
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
De mon blog :
/// <summary>
/// This utility function displays all the IP (v4, not v6) addresses of the local computer.
/// </summary>
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 (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address))
continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ")");
}
}
MessageBox.Show(sb.ToString());
}
En particulier, je not ne recommande pas Dns.GetHostAddresses(Dns.GetHostName());
, quelle que soit la popularité de cette ligne dans divers articles et blogs.
Voici une fonction que j'utilise:
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;
}
En tant que dénombrable:
public static IEnumerable<string> GetIP4Addresses()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
.Select(x => x.ToString());
}
Très propre et doux lors de l'utilisation de Linq
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
Écrivez locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
De MSDN on Dns.GetHostAddresses ,
Lorsqu'une chaîne vide est passée en tant que nom d'hôte, cette méthode retourne les adresses IPv4 de l'hôte local pour tous les systèmes d'exploitation, à l'exception de Windows Server 2003; pour Windows Server 2003, IPv4 et IPv6 les adresses de l'hôte local sont renvoyées.
Les adresses IPv6 sont filtrées des résultats de GetHostAddresses méthode si IPv6 n’est pas installé sur l’ordinateur local. Comme un Par conséquent, il est possible de récupérer une instance IPAddress vide si seulement Les résultats IPv6, s'ils étaient disponibles, pour hostNameOrAddress.parameter.
Vous pouvez donc utiliser ceci pour essayer de l’analyser :
IPAddress.TryParse
puis cochez AddressFamily
qui
Renvoie System.Net.Sockets.AddressFamily.InterNetwork pour IPv4 ou System.Net.Sockets.AddressFamily.InterNetworkV6 pour IPv6.
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;
}
}
J'ai utilisé la réponse qui a commencé avec
/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
Je devais utiliser:
if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
mais j'ai effectivement utilisé:
if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))
Aussi, j'ai ajouté:
if (network.OperationalStatus != OperationalStatus.Up)
continue;
Parce que certains réseaux ne fonctionnaient pas et n'auraient jamais dû y être, j'ai constaté qu'ils étaient dans le registre.
J'utilise cette méthode d'assistance qui renvoie la première adresse IPV4 active après avoir filtré l'IPV6 et le bouclage une fois
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;
}
Pour moi, la solution plus propre serait:
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;
}
Voici un code pour trouver le premier IPv4 connecté en utilisant la boucle for:
IPAddress ipAddress = null;
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
for (int i=0 ; i<localIPs.Length ; i++)
{
if (localIPs[i].AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = localIPs[i];
break;
}
}
C'est mon code… .. Et je peux le trouver sur plusieurs cartes 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;
}