2008-09-29 16 views

Odpowiedz

25

Link Mówi tam, dodać System.Net i używając następujących

//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

Który adres IP w tablicy, która otrzymasz, jest właściwa? – EBGreen

+6

GetHostByName pokazane jako przestarzałe. zakończone przy użyciu: Adres IP [] ipAddress = Dns.GetHostAddresses (strHostName); dokonuje się to samo. –

+12

Również węgierska notacja jest prawie martwa w tym momencie. Użyj nazwy hosta string. –

11

jako maszyna może mieć wiele adresów IP, poprawny sposób, aby dowiedzieć się Twój adres IP, który masz zamiar użyj, aby skierować się do ogólnego Internetu, aby otworzyć gniazdo do hosta w Internecie, a następnie sprawdź połączenie z gniazdem, aby zobaczyć, jaki jest adres lokalny, który jest używany w tym połączeniu.

Sprawdzając połączenie z gniazdem, będziesz mógł wziąć pod uwagę dziwne tablice routingu, wiele adresów IP i zwariowanych nazw hostów. Sztuczka z powyższą nazwą może działać, ale nie uważam tego za całkowicie niezawodną.

36

Jeśli szukasz informacji, które może dostarczyć narzędzie wiersza poleceń, ipconfig, prawdopodobnie powinieneś używać przestrzeni nazw System.Net.NetworkInformation.

Ten przykładowy kod wyliczy wszystkie interfejsy sieciowe i zrzuci adresy znane dla poszczególnych adapterów.

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

Jesteś prawdopodobnie najbardziej zainteresowany UnicastAddresses.

24

Używanie Dns wymaga, aby komputer był zarejestrowany na lokalnym serwerze DNS, co niekoniecznie musi być prawdziwe, jeśli korzystasz z intranetu, a jeszcze rzadziej, gdy jesteś w domu z usługodawcą internetowym. Wymaga to również połączenia z siecią - wszystko, aby dowiedzieć się informacji o swoim komputerze.

Właściwym sposobem:

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: Poprawiono kilka problemów z kodem)

lub dla tych, którzy lubią tylko linię LINQ:

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

hej James, ha 'NetworkInformation' z linii odpowiedzi nr: 2, C# kompilator informujący, że" nie można znaleźć typu lub przestrzeni nazw ", zaimportowałem' System.Net.NetworkInformation' już wtedy mówiąc "brak lub brak przestrzeni nazw" , o co chodzi ? – FosterZ

+1

@FosterZ: Zgadzam się (nie działa tak, jak jest). Zaimplementowałem ten kod jako: foreach (NetworkInterface ni in nics) {foreach (UnicastIPAddressInformation x in ni.GetIPProperties(). UnicastAddresses) {if (x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) {Konsola .WriteLine ("Adres IP ........: {0: x}", x.Address.ToString()); }}} 'i wydrukowało mieszaninę większości moich rzeczywistych adresów IP i kilku innych adresów nie-my-ip. – user664939

1

Jeśli wiesz, że jest jeden lub więcej adresów IPv4 dla twojego komputera, dostarczysz jedno z nich:

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

GetHostAddresses normalnie blokuje wątek wywołujący podczas kwerendy na serwerze DNS i generuje SocketException, jeśli zapytanie nie powiedzie się. Nie wiem, czy pomija połączenie sieciowe podczas wyszukiwania własnej nazwy hosta.

Powiązane problemy