2009-06-22 6 views
4

En C#:Obtenir l'adresse IP-

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName()); 

for (int i = 0; i < IPHost.AddressList.Length; i++) 
{ 
    textBox1.AppendText("My IP address is: " 
     + IPHost.AddressList[i].ToString() + "\r\n"); 
} 

Dans ce code, la variable IPHostEntry contient toutes les adresses IP de l'ordinateur. Maintenant, autant que je sache, Windows Vista renvoie un certain nombre d'adresses IP certaines en hexadécimal, d'autres en notation décimale et ainsi de suite.

Le problème est que la notation décimale que l'on souhaite changer son emplacement dans la variable IPHostEntry: Au départ, il a été produit dans le dernier emplacement et ainsi pourrait être accessible avec le code:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 1].ToString(); 

Cependant après avoir modifié la adresse IP de l'ordinateur, il apparaît maintenant dans la 2ème dernière position, et doit donc être consulté en utilisant le code:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 2].ToString(); 

Yat-il un code qui récupère les adresses IP en notation décimale quel que soit son emplacement dans la variable IPHostEntry ??

+1

Je crains que vous ne restiez confus à moins que vous ne vous rendiez compte de ce qui rend l'adresse IP que vous recherchez plus appropriée à vos fins que toutes les autres. S'appuyer sur des commandes magiques et non documentées dans les valeurs de retour est une mauvaise pratique. –

+0

De quelles adresses IP recherchez-vous? Tous? –

Répondre

1

Je crois que ce que vous demandez est que vous pouvez faire la différence entre l'adresse IPv4 et IPv6 retournée par votre requête DNS. La réponse est oui. Vérifiez le AddressFamily property sur l'adresse IP et assurez-vous qu'il renvoie InterNetwork.

1

Vos adresses hexadécimales sont IPv6, les 4 nombres décimaux sont ipv4.

9

En supposant que vous ne voulez que l'adresse IPv4, j'utilise actuellement ce code (modifié un peu pour l'envoi) qui est assez robuste pour mon utilisation. Il suffit de se prévaloir ToString sur le résultat pour obtenir l'adresse:.

// return the first IPv4, non-dynamic/link-local, non-loopback address 
public static IPAddress GetIPAddress() 
{ 
    IPAddress[] hostAddresses = Dns.GetHostAddresses(""); 

    foreach (IPAddress hostAddress in hostAddresses) 
    { 
     if (hostAddress.AddressFamily == AddressFamily.InterNetwork && 
      !IPAddress.IsLoopback(hostAddress) && // ignore loopback addresses 
      !hostAddress.ToString().StartsWith("169.254.")) // ignore link-local addresses 
      return hostAddress; 
    } 
    return null; // or IPAddress.None if you prefer 
} 

La partie 169,254 * peut sembler un hack, mais est documentée dans IETF RFC 3927.