2009-06-29 21 views
44

Mam tutaj kod, który działa świetnie na maszynach IPv4, ale na naszym serwerze kompilacji (IPv6) nie działa. W skrócie:Uzyskaj adresy IPv4 od Dns.GetHostEntry()

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

Dokumentacja GetHostEntry mówi, że przekazując string.Empty będzie Ci adres IPv4 localhost. To jest to czego chcę. Problem polega na tym, że zwraca on ciąg ":: 1:" na naszym komputerze IPv6, który moim zdaniem jest adresem IPv6.

Pingowanie urządzenia z dowolnego innego urządzenia IPv4 daje dobry adres IPv4 ... i robi „ping -4 MachineName” z siebie daje prawidłowy adres IPv4 .... ale pingowanie regularnie od siebie daje " :: 1: ".

Jak mogę uzyskać IPv4 dla tego komputera, od siebie?

Odpowiedz

60

Czy spojrzałeś na all the addresses w odpowiedzi, odrzuć te z family InterNetworkV6 i zachowaj tylko te IPv4?

+1

AHHHH ... Oczywiście . Moment żarówka. Dzięki! – zombat

+1

+1: Dzięki - chciałem zadać to samo pytanie :) –

+0

Moje połączenie zwraca tylko ipv6, brak wpisów IPv4. Jeśli zrobię 'Resolve-DnsName -Type A' w PowerShell, otrzymam IPv4 z powrotem (domyślny typ, który zwraca w tym przypadku to 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 i myhost w zmiennej publicznej i używać w dowolnej funkcji formularza.

39

Aby znaleźć wszystkie lokalne adresy IPv4:

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

lub użyj Array.Find lub Array.FindLast jeśli chcesz tylko jeden.

+6

+1 za używanie linq – Nahum

+1

@NahumLitvin Ale to nie jest linq? – Lukazoid

+0

@lukazoid ita nie. Mogłem mieć na myśli wyrażenie lambda – Nahum

0

znaleźć wszystkie ważne listy adresów Jest to kod Użyłem

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 jest metodą, a nie właściwością. – RenniePet

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