J'ai un code ici qui fonctionne très bien sur les machines IPv4, mais il échoue sur notre serveur de compilation (un IPv6). En un mot:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
La documentation de GetHostEntry indique que le fait de passer string.Empty vous donnera l'adresse IPv4 de l'hôte local. C'est ce que je veux. Le problème est qu’il renvoie la chaîne ":: 1:" sur notre machine IPv6, qui est, je crois, l’adresse IPv6.
Faire un ping sur la machine depuis une autre machine IPv4 donne une bonne adresse IPv4 ... et faire un "ping -4 machinename" à partir de lui-même donne la bonne adresse IPv4 .... 1:".
Comment puis-je obtenir l'IPv4 pour cette machine, à partir de lui-même?
Avez-vous consulté toutes les adresses dans le retour, ignorez celles de la famille InterNetworkV6 et conservez uniquement les adresses IPv4?
Pour trouver toutes les adresses IPv4 locales:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
ou utilisez Array.Find
ou Array.FindLast
si vous en voulez 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éclarez myIP et myHost en variable publique Et utilisez-les dans n'importe quelle fonction 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 trouver toute la liste d'adresses valide, c'est le code que j'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();
}