Wie bekomme ich nur Internet Protocol Version 4 Adressen von Dns.GetHostAddresses()
? Ich habe den folgenden Code und gibt mir IPv4- und IPv6-Adressen Ich muss es mit Boxen funktionieren lassen, die mehrere IPv4-Adressen haben.
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
private void get_IPs()
{
foreach (IPAddress a in localIPs)
{
server_ip = server_ip + a.ToString() + "/";
}
}
fügen Sie dem Code so etwas hinzu
if( IPAddress.Parse(a).AddressFamily == AddressFamily.InterNetwork )
// IPv4 address
Aus mein 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());
}
Insbesondere empfehle ich notDns.GetHostAddresses(Dns.GetHostName());
, unabhängig davon, wie beliebt diese Zeile in verschiedenen Artikeln und Blogs ist.
Hier ist eine Funktion, die ich benutze:
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;
}
Als zahlreich:
public static IEnumerable<string> GetIP4Addresses()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.Where(IPA => IPA.AddressFamily == AddressFamily.InterNetwork)
.Select(x => x.ToString());
}
Sehr sauber und süß bei der Verwendung von Linq
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()).Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
locaIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
schreiben
Von MSDN unter Dns.GetHostAddresses ,
Wenn eine leere Zeichenfolge als Hostname übergeben wird, gibt diese Methode .__ zurück. die IPv4-Adressen des lokalen Hosts für alle Betriebssysteme außer Windows Server 2003; für Windows Server 2003 sowohl IPv4 als auch IPv6 Adressen für den lokalen Host werden zurückgegeben.
IPv6-Adressen werden aus den Ergebnissen der GetHostAddresses .__ gefiltert. Methode, wenn auf dem lokalen Computer kein IPv6 installiert ist. Als ein Daher ist es möglich, eine leere IPAddress-Instanz zurückzuholen, wenn nur IPv6-Ergebnisse, soweit für den Parameter hostNameOrAddress. verfügbar.
Sie können dies also verwenden, um zu testen und zu analysieren :
IPAddress.TryParse
dann AddressFamily
prüfen, welche
Gibt System.Net.Sockets.AddressFamily.InterNetwork für IPv4 oder .__ zurück. System.Net.Sockets.AddressFamily.InterNetworkV6 für 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;
}
}
Ich habe die Antwort verwendet, die mit begann
/// <summary> and it mostly worked:
//for some reason Visual Studio 2010 did not understand AddressFamily.Inernetwork
if (address.Address.AddressFamily != AddressFamily.InterNetwork)
Ich musste verwenden:
if(address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
aber ich habe tatsächlich benutzt:
if(!address.Address.AddressFamily.Equals(System.Net.Sockets.AddressFamily.InterNetwork))
Ich habe auch hinzugefügt:
if (network.OperationalStatus != OperationalStatus.Up)
continue;
Da es einige Netzwerke gab, die nicht funktionierten und niemals dort gewesen sein sollten, habe ich gesehen, dass sie in der Registrierung waren. Alvin
Ich verwende diese Hilfsmethode, die die erste aktive IPV4-Adresse zurückgibt, nachdem IPV6 und Loopback einmal ausgefiltert wurden
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;
}
Für mich wäre die sauberere Lösung:
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;
}
Hier ist ein Code, um das erste verbundene IPv4 mithilfe von for-Schleife zu finden:
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;
}
}
Dies ist mein Code ... und kann auf vielen LAN-Karten gefunden werden.
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;
}