2009-06-29 11 views
44

Qui ho un codice che funziona perfettamente con le macchine IPv4, ma sul nostro server di build (un IPv6) non funziona. In poche parole:Ottieni indirizzi IPv4 da Dns.GetHostEntry()

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

La documentazione per GetHostEntry dice che passando string.Empty otterrà l'indirizzo IPv4 del localhost. Questo è quello che voglio. Il problema è che sta restituendo la stringa ":: 1:" sulla nostra macchina IPv6, che credo sia l'indirizzo IPv6.

Pinging la macchina da qualsiasi altra macchina IPv4 dà un buon indirizzo IPv4 ... e facendo un "ping -4 machinename" da se stessa dà l'indirizzo IPv4 corretto .... ma il ping regolarmente da se stessa dà " :: 1:".

Come posso ottenere IPv4 per questa macchina da solo?

risposta

60

Hai guardato a all the addresses nel reso, scartare quelli di family InterNetworkV6 e conservare solo quelli IPv4?

+1

Ahhhh ... naturalmente . Un momento lampadina. Grazie! – zombat

+1

+1: Grazie - stavo per fare la stessa domanda :) –

+0

La mia chiamata restituisce solo ipv6, nessuna voce ipv4. Se eseguo 'Resolve-DnsName -Type A' in PowerShell, riavvio di IPv4 (il tipo predefinito restituito in questo caso è 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 e myhost nella variabile pubblica e utilizzare in ogni funzione della forma.

39

per trovare tutti gli indirizzi IPv4 locali:

IPAddress[] ipv4Addresses = Array.FindAll(
    Dns.GetHostEntry(string.Empty).AddressList, 
    a => a.AddressFamily == AddressFamily.InterNetwork); 

o utilizzare Array.Find o Array.FindLast se si desidera solo uno.

+6

+1 per l'utilizzo di linq – Nahum

+1

@NahumLitvin Ma questo non è linq? – Lukazoid

+0

@lukazoid ita no. Potrei aver inteso l'espressione lambda – Nahum

0

per trovare tutti i elenco di indirizzi validi Questo è il codice ho usato

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 è un metodo, non una proprietà. – RenniePet

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