W Internecie jest kilka miejsc, które pokazują, jak uzyskać adres IP. I wiele z nich wygląda jak ten przykład:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
W tym przykładzie otrzymuję kilka adresów IP, ale interesuje mnie tylko ten, który router przypisuje do komputera z programem: adres IP, który dałbym komuś, jeśli chce uzyskać dostęp do folderu współdzielonego na moim komputerze instancja.
Jeśli nie mam połączenia z siecią i jestem podłączony do Internetu bezpośrednio przez modem bez routera, chciałbym otrzymać błąd. Jak mogę sprawdzić, czy mój komputer jest podłączony do sieci za pomocą C # i czy tak jest, aby uzyskać adres IP LAN.
c#
networking
Tono Nam
źródło
źródło
If I am not connected to a network and I am connected to the internet
To stwierdzenie wydaje się sprzeczne. Czy próbujesz dowiedzieć się, czy komputer jest podłączony do prywatnej sieci LAN czy Internetu?Odpowiedzi:
Aby uzyskać lokalny adres IP:
Aby sprawdzić, czy masz połączenie czy nie:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
źródło
Istnieje dokładniejszy sposób, gdy na lokalnym komputerze dostępnych jest wiele adresów IP.
Connect
gniazdo UDP i przeczytaj jego lokalny punkt końcowy:Connect
na gnieździe UDP ma następujący efekt: ustawia miejsce docelowe dlaSend
/Recv
, odrzuca wszystkie pakiety z innych adresów i - właśnie tego używamy - przenosi gniazdo do stanu „połączonego”, ustawia odpowiednie pola. Obejmuje to sprawdzenie istnienia trasy do miejsca docelowego zgodnie z tablicą routingu systemu i odpowiednie ustawienie lokalnego punktu końcowego. Ostatnia część wydaje się być nieudokumentowana oficjalnie, ale wygląda na integralną cechę API gniazd Berkeley (efekt uboczny stanu „podłączonego” UDP), który działa niezawodnie zarówno w systemie Windows, jak i Linux w różnych wersjach i dystrybucjach.Tak więc ta metoda da adres lokalny, który będzie używany do łączenia się z określonym hostem zdalnym. Nie ustanowiono rzeczywistego połączenia, dlatego określony zdalny adres IP może być nieosiągalny.
źródło
Refaktoryzacja kodu Mrcheifa w celu wykorzystania Linq (tj. .Net 3.0+). .
:)
źródło
Wiem, że to może kopać martwego konia, ale może to komuś pomóc. Wszędzie szukałem sposobu na znalezienie mojego lokalnego adresu IP, ale wszędzie tam jest napisane, aby użyć:
W ogóle mi się to nie podoba, ponieważ po prostu dostaje wszystkie adresy przypisane do twojego komputera. Jeśli masz wiele interfejsów sieciowych (które robią obecnie prawie wszystkie komputery), nie masz pojęcia, który adres pasuje do którego interfejsu sieciowego. Po przeprowadzeniu wielu badań stworzyłem funkcję, aby użyć klasy NetworkInterface i wyciągnąć z niej informacje. W ten sposób mogę powiedzieć, jaki to jest interfejs (Ethernet, bezprzewodowy, pętla zwrotna, tunel itp.), Czy jest aktywny czy nie, i SOOO znacznie więcej.
Teraz, aby uzyskać adres IPv4 połączenia z interfejsem sieci Ethernet:
Lub twój interfejs bezprzewodowy:
Jeśli spróbujesz uzyskać adres IPv4 dla interfejsu bezprzewodowego, ale twój komputer nie ma zainstalowanej karty bezprzewodowej, zwróci tylko pusty ciąg. To samo z interfejsem Ethernet.
Mam nadzieję, że to komuś pomoże! :-)
EDYTOWAĆ:
Zwrócono uwagę (dzięki @NasBanov), że chociaż ta funkcja zajmuje się wyodrębnianiem adresu IP w znacznie lepszy sposób niż używanie
Dns.GetHostEntry(Dns.GetHostName())
go, nie radzi sobie dobrze z obsługą wielu interfejsów tego samego typu lub wielu adresów IP na jednym interfejsie . Zwróci tylko jeden adres IP, gdy może być przypisanych wiele adresów. Aby zwrócić WSZYSTKIE przypisane adresy, wystarczy manipulować oryginalną funkcją, aby zawsze zwracała tablicę zamiast pojedynczego łańcucha. Na przykład:Teraz ta funkcja zwróci WSZYSTKIE przypisane adresy dla określonego typu interfejsu. Teraz, aby uzyskać tylko jeden ciąg, możesz użyć
.FirstOrDefault()
rozszerzenia, aby zwrócić pierwszy element w tablicy lub, jeśli jest pusty, zwrócić pusty ciąg.źródło
item.OperationalStatus
zawsze zwracaUnknown
.Oto zmodyfikowana wersja (z wersji compman2408), która działała dla mnie:
Możesz wywołać tę metodę na przykład:
Zmiana: pobieram adres IP z adaptera, do którego przypisano adres IP bramy. Druga zmiana: dodałem dokumenty i instrukcję break, aby ta metoda była bardziej wydajna.
źródło
break
w najbardziej wewnętrznejif
lubreturn
zrobiłby lewę.To najlepszy kod, jaki znalazłem, aby uzyskać bieżący adres IP, unikając hosta VMWare lub innego nieprawidłowego adresu IP.
źródło
Myślę, że korzystanie z LinQ jest łatwiejsze:
źródło
Dla śmiechu, pomyślałem, że spróbuję uzyskać pojedynczą instrukcję LINQ za pomocą nowego operatora warunkowego C # 6. Wygląda na dość szalonego i prawdopodobnie okropnie nieefektywnego, ale działa.
Logika dzięki uprzejmości
Gerardo H
(i przez odniesieniecompman2408
).źródło
Inny sposób uzyskania adresu IP za pomocą wyrażenia linq:
źródło
@mrcheif Znalazłem tę odpowiedź dzisiaj i była bardzo przydatna, chociaż zwróciła zły adres IP (nie z powodu niedziałającego kodu), ale dała zły adres IP sieci, gdy masz takie rzeczy jak Himachi.
źródło
192.0.0.0/8
nie jest to poprawny test prywatnego adresu IP (istnieją 3 zakresy, wszystkie inne od tego), może to być również zasięg sieci korporacyjnej, więc nie tyle „lokalny”.Testowany z jedną lub wieloma kartami LAN i maszynami wirtualnymi
źródło
Tylko zaktualizowana wersja mojego przy użyciu LINQ:
źródło
Wymagania wstępne: musisz dodać odwołanie System.Data.Linq i odwołać się do niego
źródło
Miałem również problemy z uzyskaniem poprawnego adresu IP.
Wypróbowałem tutaj różne rozwiązania, ale żadne nie zapewniło mi pożądanego efektu. Prawie wszystkie dostarczone testy warunkowe nie spowodowały użycia adresu.
To działało dla mnie, mam nadzieję, że to pomaga ...
źródło
źródło
Pamiętaj, że w ogólnym przypadku możesz mieć wiele tłumaczeń NAT i wiele serwerów dns, z których każdy działa na różnych poziomach translacji NAT.
Co zrobić, jeśli masz NAT klasy operatorskiej i chcesz komunikować się z innymi klientami tego samego operatora? W ogólnym przypadku nigdy nie wiadomo na pewno, ponieważ możesz występować z różnymi nazwami hostów przy każdym tłumaczeniu NAT.
źródło
Przestarzałe odeszło, to działa dla mnie
źródło
Aktualizując odpowiedź Mrchiefa za pomocą Linq, będziemy mieli:
źródło
Zwraca adresy z interfejsów, które mają adresy bram i adresy emisji pojedynczej na dwóch osobnych listach, IPV4 i IPV6.
źródło
Jest już wiele odpowiedzi, ale nadal wnoszę swój jeden:
Jedna wkładka:
Uwaga: Wyszukaj od ostatniego, ponieważ nadal działało po dodaniu niektórych interfejsów do urządzenia, takich jak MobileHotspot, VPN lub innych fantazyjnych kart wirtualnych.
źródło
Dodatkowo prosty kod do uzyskania klienta IP:
Mam nadzieję, że to ci pomoże.
źródło
źródło
Zmodyfikowano kod compman2408, aby móc iterować po każdym z nich
NetworkInterfaceType
.Możesz to tak nazwać:
źródło
Poniżej tej samej akcji
Funkcja LocalIP ()
Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Return True
Funkcja zakończenia
źródło
jeden wiersz kodu: D
źródło
Jeśli masz maszyny wirtualne lub dodatkowe karty sieciowe, na liście adresów mogą znajdować się inne wartości. Moją propozycją jest sprawdzenie wpisów listy adresowej i wydrukowanie, które są odpowiednie. W moim przypadku pozycja 3 to adres IPv4 mojej maszyny
Nie zapomnij dodać
using System.Net;
źródło