2008-09-29 6 views

Antwort

25

Link Dort heißt es, fügen Sie System.net, und mit dem folgenden

//To get the local IP address 
string sHostName = Dns.GetHostName(); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString()); 
} 
+0

Welche IP-Adresse im Array, die Sie zurück erhalten, ist die richtige? – EBGreen

+6

GetHostByName wird als veraltet angezeigt. aufgewickelt werden: IPAddress [] = ipAddress Dns.GetHostAddresses (strHostName); führt die gleiche Sache. –

+12

Auch die ungarische Schreibweise ist zu diesem Zeitpunkt fast tot. Verwenden Sie Zeichenfolge hostName. –

11

Als eine Maschine mehrere IP-Adressen haben kann, den richtigen Weg, Ihre IP-Adresse, um herauszufinden, dass Sie gehen zu Um zu dem allgemeinen Internet zu routen, muss man einen Socket zu einem Host im Internet öffnen und dann die Socket-Verbindung überprüfen, um zu sehen, welche lokale Adresse in dieser Verbindung verwendet wird.

Durch die Socket-Verbindung genauer ansehen, werden Sie mehrere IP-Adressen und Hostnamen whacky Rechnung seltsame Routing-Tabellen, übernehmen können. Der Trick mit dem obigen Hostnamen kann funktionieren, aber ich würde es nicht als absolut zuverlässig betrachten.

36

Wenn Sie nach der Art von Informationen suchen, die das Befehlszeilenprogramm ipconfig bereitstellen kann, sollten Sie wahrscheinlich den Namespace System.Net.NetworkInformation verwenden.

Dieser Beispielcode wird alle Netzwerkschnittstellen auflisten und die für jeden Adapter bekannten Adressen ausgeben.

using System; 
using System.Net; 
using System.Net.NetworkInformation; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      Console.WriteLine("Network Interface: {0}", netif.Name); 
      IPInterfaceProperties properties = netif.GetIPProperties(); 
      foreach (IPAddress dns in properties.DnsAddresses) 
       Console.WriteLine("\tDNS: {0}", dns); 
      foreach (IPAddressInformation anycast in properties.AnycastAddresses) 
       Console.WriteLine("\tAnyCast: {0}", anycast.Address); 
      foreach (IPAddressInformation multicast in properties.MulticastAddresses) 
       Console.WriteLine("\tMultiCast: {0}", multicast.Address); 
      foreach (IPAddressInformation unicast in properties.UnicastAddresses) 
       Console.WriteLine("\tUniCast: {0}", unicast.Address); 
     } 
    } 
} 

Sie sind wahrscheinlich am meisten an den UnicastAddresses interessiert.

24

Dns Verwendung erfordert, dass der Computer mit dem lokalen DNS-Server registriert werden, was nicht unbedingt der Fall ist, wenn Sie auf einem Intranet sind, und noch weniger wahrscheinlich, wenn Sie zu Hause mit einem ISP sind. Es erfordert auch eine Netzwerk-Roundtrip - alles um Informationen über Ihren eigenen Computer zu erfahren.

Der richtige Weg:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
foreach(NetworkInterface adapter in nics) 
{ 
    foreach(var x in adapter.GetIPProperties().UnicastAddresses) 
    { 
     if (x.Address.AddressFamily == AddressFamily.InterNetwork && x.IsDnsEligible) 
     { 
        Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString()); 
     } 
    } 
} 

(UPDATE 31-Jul-2015: Fest einige Probleme mit dem Code)

Oder für diejenigen, die nur eine Linie von Linq mögen:

NetworkInterface.GetAllNetworkInterfaces() 
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses) 
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible) 
    .Select (adr => adr.Address.ToString()); 
+0

Hey James, ha 'NetworkInformation' von deiner Antwort Zeile Nr: 2, C# Compiler sagen" Typ oder Namespace konnte nicht gefunden werden ", ich habe' System.Net.NetworkInformation' bereits dann auch seine Aussage "Typ oder Namespace fehlt" importiert , was ist das Problem ? – FosterZ

+1

@FosterZ: Ich stimme zu (es funktioniert nicht wie es ist). Ich habe diesen Code implementiert als: 'foreach (NetworkInterface ni nics) {foreach (UnicastIPAddressInformationx in ni.GetIPProperties(). UnicastAddresses) {if (x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) {Konsole .WriteLine ("IP-Adresse ........: {0: x}", x.Address.ToString()); }}} 'und es hat eine Mischung aus den meisten meiner tatsächlichen IP-Adressen und einigen anderen nicht-meine-IP-Adressen ausgedruckt. – user664939

1

Wenn Sie wissen, dass eine oder mehrere IPv4-Adressen für Ihren Computer vorhanden sind, wird einer davon bereitgestellt:

Dns.GetHostAddresses(Dns.GetHostName()) 
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString() 

GetHostAddresses blockiert normalerweise den aufrufenden Thread, während es den DNS-Server abfragt, und löst eine SocketException aus, wenn die Abfrage fehlschlägt. Ich weiß nicht, ob es den Netzwerkaufruf überspringt, wenn er Ihren eigenen Hostnamen sucht.

Verwandte Themen