Obtenir les adresses IPv4 de Dns.GetHostEntry ()
Question
J'ai un code ici qui fonctionne très bien sur les machines IPv4, mais sur notre serveur de build (un IPv6), il tombe en panne. En bref:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
La documentation GetHostEntry dit que passant string.Empty vous obtiendrez l'adresse IPv4 de l'hôte local. C'est ce que je veux. Le problème est qu'il est de retour de la chaîne « :: 1: ». Sur notre machine IPv6, que je crois est l'adresse IPv6
Pinging la machine de toute autre machine IPv4 donne une bonne adresse IPv4 ... et de faire un "ping -4 machinename" de lui-même donne l'adresse IPv4 correcte .... mais régulièrement pinger de lui-même donne ":: 1:".
Comment puis-je obtenir l'IPv4 pour cette machine, de lui-même?
La solution
Avez-vous regardé tous les adresses dans le retour, jetez-les de InterNetworkV6 famille et ne conserver que celles IPv4?
Autres conseils
Pour toutes les adresses IPv4 locales:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
ou utiliser ou Array.Find
si vous voulez Array.FindLast
juste un.
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
public Form1()
{
InitializeComponent();
string myHost = System.Net.Dns.GetHostName();
string myIP = null;
for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
{
myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
}
}
}
Déclarer myIP et Myhost dans variable publique et l'utilisation dans une fonction quelconque du formulaire.
public static string GetIPAddress(string hostname)
{
IPHostEntry host;
host = Dns.GetHostEntry(hostname);
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
return ip.ToString();
}
}
return string.Empty;
}
Pour toute liste d'adresses valide c'est le code que je l'ai utilisé
public static IEnumerable<string> GetAddresses()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}
IPv6
lblIP.Text = System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (0) .ToString ()
IPv4
lblIP.Text = System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (1) .ToString ()