2009-06-29 5 views
44

J'ai du code ici qui fonctionne très bien sur les machines IPv4, mais sur notre serveur de construction (un IPv6) il échoue. En un mot:Obtenir des adresses IPv4 à partir de Dns.GetHostEntry()

IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty); 

La documentation GetHostEntry dit que le passage à string.Empty vous obtiendrez l'adresse IPv4 de l'hôte local. C'est ce que je veux. Le problème est qu'il retourne la chaîne ":: 1:" sur notre machine IPv6, qui 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 pinger régulièrement de lui-même donne " ::1:".

Comment puis-je obtenir l'IPv4 pour cette machine, de lui-même?

Répondre

60

Avez-vous regardé all the addresses dans la déclaration, abandonnez ceux de family InterNetworkV6 et ne retenez que ceux d'IPv4?

+1

Ahhhh ... bien sûr . Un moment d'ampoule. Merci! – zombat

+1

+1: Merci - J'étais sur le point de poser cette même question :) –

+0

Mon appel ne renvoie que ipv6, pas d'entrées ipv4. Si je fais 'Resolve-DnsName -Type A' dans PowerShell, je récupère l'IPv4 (le type par défaut qu'il renvoie dans ce cas est AAAA). – kamranicus

6
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(); 
      } 
     } 
    } 

Declare myIP et Myhost dans variable publique et l'utilisation en toute fonction de la forme.

39

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 voulez juste un.

+6

+1 pour utiliser linq – Nahum

+1

@NahumLitvin Mais ce n'est pas linq? – Lukazoid

+0

@lukazoid ita pas. Je pourrais avoir signifié l'expression de lambda – Nahum

0

Pour trouver toutes les 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(); 
} 
2
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; 
    } 
-1

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()

+0

System.Net.Dns.GetHostName est une méthode, pas une propriété. – RenniePet

5
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName); 
IPAddress ipAddress = ipHostInfo.AddressList 
    .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork); 
Questions connexes