Korzystam z serwera i chcę wyświetlić własny adres IP.
Jaka jest składnia na uzyskanie własnego (w miarę możliwości, zewnętrznego) adresu IP komputera?
Ktoś napisał następujący kod.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
Jednak ogólnie nie ufam autorowi i nie rozumiem tego kodu. Czy jest na to lepszy sposób?
c#
ip-address
Nefzen
źródło
źródło
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Odpowiedzi:
Nie, to prawie najlepszy sposób na zrobienie tego. Ponieważ maszyna może mieć kilka adresów IP, musisz iterować ich zbiór, aby znaleźć właściwy.
Edycja: Jedyne, co chciałbym zmienić, to zmienić to:
do tego:
Nie ma potrzeby
ToString
wyliczania do porównania.źródło
break
stwierdzenie po tym, jak zostanie wykryte IP, aby uniknąć niepotrzebnego iterowania przez kolekcję (w tym przypadku wątpię, aby wpływ na wydajność kiedykolwiek miał znaczenie, ale lubię podkreślać ogólnie dobre nawyki kodowania)Jedynym sposobem na poznanie twojego publicznego adresu IP jest poproszenie kogoś innego, aby ci powiedział; ten kod może ci pomóc:
źródło
Środek czyszczący i wszystko w jednym: D
źródło
Jeśli nie możesz polegać na uzyskaniu adresu IP z serwera DNS (co mi się przydarzyło), możesz zastosować następujące podejście:
Przestrzeń nazw System.Net.NetworkInformation zawiera klasę NetworkInterface , która ma statyczną metodę GetAllNetworkInterfaces .
Ta metoda zwróci wszystkie „interfejsy sieciowe” na twoim komputerze i ogólnie jest ich całkiem sporo, nawet jeśli masz tylko kartę bezprzewodową i / lub sprzęt karty Ethernet zainstalowany na twoim komputerze. Wszystkie te interfejsy sieciowe mają prawidłowe adresy IP dla twojego komputera lokalnego, chociaż prawdopodobnie potrzebujesz tylko jednego.
Jeśli szukasz jednego adresu IP, musisz przefiltrować listę, aż znajdziesz właściwy adres. Prawdopodobnie będziesz musiał przeprowadzić eksperymenty, ale udało mi się osiągnąć następujące podejście:
OperationalStatus == OperationalStatus.Up
. Wyklucza to fizyczny adapter Ethernet, na przykład, jeśli nie masz podłączonego kabla sieciowego.Dla każdego NetworkInterface można uzyskać obiekt IPInterfaceProperties przy użyciu metody GetIPProperties , a z obiektu IPInterfaceProperties można uzyskać dostęp do właściwości UnicastAddresses, aby uzyskać listę obiektów UnicastIPAddressInformation .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.W tym momencie biorę adres pierwszego (jeśli w ogóle) adresu emisji pojedynczej, który pasuje do wszystkich tych filtrów.
EDYTOWAĆ:
[zmieniony kod 16 maja 2018 r., aby uwzględnić warunki wymienione w powyższym tekście dla stanu wykrywania duplikatów adresów i preferowanego czasu życia]
Poniższy przykład pokazuje filtrowanie na podstawie statusu operacyjnego, rodziny adresów, z wyłączeniem adresu sprzężenia zwrotnego (127.0.0.1), stanu wykrywania duplikatów adresów i preferowanego czasu życia.
źródło
źródło
Właśnie przetestowałem to na moim komputerze i działa.
źródło
Jeśli chcesz uniknąć używania DNS:
źródło
Nie polegaj cały czas na InterNetwork, ponieważ możesz mieć więcej niż jedno urządzenie, które również korzysta z IP4, co popsułoby wyniki w uzyskiwaniu twojego IP. Teraz, jeśli chcesz, możesz po prostu skopiować to i przejrzeć je lub zaktualizować do swojego uznania.
Najpierw dostaję adres routera (bramy) Jeśli wróci, że jestem podłączony do bramy (co oznacza, że nie jestem podłączony bezpośrednio do modemu bezprzewodowo lub nie), to mamy adres bramy jako adres IP, w przeciwnym razie jesteśmy wskaźnikiem zerowym .
Następnie musimy uzyskać listę adresów IP komputera. To nie jest tak trudne, ponieważ routery (wszystkie routery) używają 4 bajtów (...). Pierwsze trzy są najważniejsze, ponieważ każdy podłączony do niego komputer będzie miał adres IP4 zgodny z pierwszymi trzema bajtami. Np .: 192.168.0.1 jest standardem dla domyślnego adresu IP routera, chyba że zostanie zmieniony przez administratora. „192.168.0” lub cokolwiek to może być, musimy dopasować. I to wszystko, co zrobiłem w funkcji IsAddressOfGateway. Powodem dopasowania długości jest to, że nie wszystkie adresy (tylko dla komputera) mają długość 4 bajtów. Jeśli wpiszesz netstat w cmd, przekonasz się, że to prawda. Więc masz to. Tak, potrzeba trochę więcej pracy, aby naprawdę dostać to, czego szukasz. Proces eliminacji. I na miłość boską nie znajduj adresu przez pingowanie, co zajmuje dużo czasu, ponieważ najpierw wysyłasz adres do pingowania, a następnie musi on wysłać wynik z powrotem. Nie, współpracuj bezpośrednio z klasami .Net, które zajmują się twoim środowiskiem systemowym, a uzyskasz odpowiedzi, których szukasz, gdy dotyczy to wyłącznie twojego komputera.
Teraz, jeśli jesteś podłączony bezpośrednio do modemu, proces jest prawie taki sam, ponieważ modem jest twoją bramą, ale podzadanie nie jest takie samo, ponieważ otrzymujesz informacje bezpośrednio z serwera DNS przez modem, a nie maskowane przez router obsługujący Internet dla ciebie, chociaż nadal możesz używać tego samego kodu, ponieważ ostatni bajt adresu IP przypisanego do modemu to 1. Więc jeśli adres IP wysłany z modemu, który się zmienia, to 111.111.111.1 ', otrzymasz 111.111.111. (Niektóre wartość bajtu). Pamiętaj, że musimy znaleźć informacje o bramie, ponieważ istnieje więcej urządzeń, które zajmują się łącznością z Internetem niż router i modem.
Teraz widzisz, dlaczego NIE zmieniasz pierwszych dwóch bajtów routera 192 i 168. Są one ściśle rozróżniane tylko dla routerów, a nie korzystania z Internetu, lub mielibyśmy poważny problem z protokołem IP i podwójnym pingowaniem powodującym awarię komputera. Obraz, że przypisany adres IP routera to 192.168.44.103 i użytkownik kliknął również witrynę z tym adresem IP. O MÓJ BOŻE! Twój komputer nie będzie wiedział, co pingować. Crash właśnie tam. Aby uniknąć tego problemu, przypisywane są tylko routery, a nie do korzystania z Internetu. Więc zostaw dwa pierwsze bajty routera w spokoju.
źródło
255.255.255.0
, i zrobi to w dość skomplikowany sposób IMO.Pomyślałem tylko, że dodam własną, linijkę (chociaż jest już wiele innych przydatnych odpowiedzi).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
źródło
Aby uzyskać bieżący publiczny adres IP, wystarczy utworzyć stronę ASPX z następującym wierszem zdarzenia ładowania strony:
źródło
Jeśli pracujesz w intranecie, będziesz mógł uzyskać adres IP komputera lokalnego, a jeśli nie, otrzymasz zewnętrzny adres IP za pomocą tego: Web:
Pulpit:
źródło
Spójrz tutaj po szczegóły.
Musisz pamiętać, że twój komputer może mieć więcej niż jeden adres IP (w rzeczywistości zawsze tak jest) - więc po co chcesz.
źródło
Spróbuj tego:
źródło
Może na podstawie zewnętrznego adresu IP możesz rozważyć (jeśli jesteś w kontekście serwera WWW), używając tego
Zadałem to samo pytanie, co ty i znalazłem w tym artykule o przepływie stosów.
To zadziałało dla mnie.
źródło
źródło
źródło
Prosty pojedynczy wiersz kodu, który zwraca pierwszy wewnętrzny adres IPV4 lub zero, jeśli nie ma. Dodany jako komentarz powyżej, ale może być przydatny dla kogoś (niektóre powyższe rozwiązania zwrócą wiele adresów, które wymagają dalszego filtrowania).
Łatwo jest również zwrócić pętlę zwrotną zamiast wartości zerowej. Myślę, że z:
źródło
IPAddress.Loopback
? :)Aby znaleźć listę adresów IP skorzystałem z tego rozwiązania
Ale osobiście lubię poniższe rozwiązanie, aby uzyskać lokalny prawidłowy adres IP
źródło
Rozwiązanie LINQ:
źródło
Oto jak to rozwiązałem. Wiem, że jeśli masz kilka fizycznych interfejsów, może nie wybrać dokładnie tego, czego chcesz.
źródło
Pytanie nie mówi: ASP.NET MVC, ale i tak zostawiam to tutaj:
źródło
Uzyskaj wszystkie adresy IP jako ciągi znaków, używając LINQ:
ABY ODfiltrować PRYWATNE ...
Najpierw zdefiniuj metodę rozszerzenia
IsPrivate()
:... a następnie użyj go do odfiltrowania prywatnych adresów IP:
źródło
Działa to dla mnie ... i powinno być szybsze w większości przypadków (jeśli nie wszystkich) niż odpytywanie serwera DNS. Dzięki App Drice Wily's Apprentice ( tutaj ).
Jako odniesienie jest to pełny kod klasy, w którym go zdefiniowałem:
źródło
Jeszcze innym sposobem uzyskania publicznego adresu IP jest użycie
resolve1.opendns.com
serwera OpenDNSmyip.opendns.com
jako żądania.W wierszu polecenia jest to:
Lub w języku C # za pomocą programu użytkowego DNSClient:
Jest to nieco czystsze niż uderzanie punktów końcowych HTTP i analizowanie odpowiedzi.
źródło
Ma to na celu uzyskanie wszystkich lokalnych adresów IP w formacie csv w VB.NET
źródło
Aby uzyskać zdalny adres IP w najszybszy możliwy sposób. Musisz użyć downloadera lub utworzyć serwer na swoim komputerze.
Wadą używania tego prostego kodu: (który jest zalecany) jest to, że uzyskanie zdalnego adresu IP zajmie 3-5 sekund, ponieważ po zainicjowaniu WebClient zawsze sprawdza ustawienia proxy.
Oto jak to naprawiłem .. (pierwszy raz nadal zajmuje 3-5 sekund), ale potem zawsze uzyska Twój zdalny adres IP w ciągu 0-2 sekund, w zależności od połączenia.
źródło