Ich verwende einen Server und möchte meine eigene IP-Adresse anzeigen.
Wie lautet die Syntax zum Abrufen der eigenen (wenn möglich externen) IP-Adresse des Computers?
Jemand hat den folgenden Code geschrieben.
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;
Im Allgemeinen misstraue ich dem Autor jedoch und verstehe diesen Code nicht. Gibt es einen besseren Weg, dies zu tun?
c#
ip-address
Nefzen
quelle
quelle
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Antworten:
Nein, das ist so ziemlich der beste Weg, es zu tun. Wie eine Maschine könnte mehr IP - Adressen haben müssen Sie Iterierte die Sammlung von ihnen die richtigen zu finden.
Edit: Das einzige , was ich würde wäre ändern , dies zu ändern:
dazu:
ToString
Zum Vergleich ist keine Aufzählung erforderlich .quelle
break
Erklärung vorschlagen , nachdem festgestellt wurde, dass das IP nicht unnötig weiter durch die Sammlung iteriert (in diesem Fall bezweifle ich, dass die Auswirkungen auf die Leistung jemals von Bedeutung sein werden, aber ich möchte allgemein gute Codierungsgewohnheiten hervorheben)Die einzige Möglichkeit, Ihre öffentliche IP-Adresse zu ermitteln, besteht darin, jemanden zu bitten, Ihnen dies mitzuteilen. Dieser Code kann Ihnen helfen:
quelle
Sauberer und alles in einem: D.
quelle
Wenn Sie sich nicht darauf verlassen können, dass Ihre IP-Adresse von einem DNS-Server abgerufen wird (was mir passiert ist), können Sie den folgenden Ansatz verwenden:
Der System.Net.NetworkInformation-Namespace enthält eine NetworkInterface-Klasse mit einer statischen GetAllNetworkInterfaces-Methode .
Diese Methode gibt alle "Netzwerkschnittstellen" auf Ihrem Computer zurück, und es gibt im Allgemeinen einige, selbst wenn Sie nur einen drahtlosen Adapter und / oder eine Ethernet-Adapterhardware auf Ihrem Computer installiert haben. Alle diese Netzwerkschnittstellen haben gültige IP-Adressen für Ihren lokalen Computer, obwohl Sie wahrscheinlich nur eine möchten.
Wenn Sie nach einer IP-Adresse suchen, müssen Sie die Liste nach unten filtern, bis Sie die richtige Adresse finden. Sie müssen wahrscheinlich experimentieren, aber ich hatte Erfolg mit dem folgenden Ansatz:
OperationalStatus == OperationalStatus.Up
. Dies schließt beispielsweise Ihren physischen Ethernet-Adapter aus, wenn Sie kein Netzwerkkabel angeschlossen haben.Für jedes NetworkInterface können Sie ein IPInterfaceProperties- Objekt mithilfe der GetIPProperties-Methode abrufen. Über ein IPInterfaceProperties-Objekt können Sie auf die UnicastAddresses-Eigenschaft zugreifen, um eine Liste der UnicastIPAddressInformation- Objekte anzuzeigen .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.An dieser Stelle nehme ich die Adresse der ersten (falls vorhanden) Unicast-Adresse, die allen diesen Filtern entspricht.
BEARBEITEN:
[Überarbeiteter Code am 16. Mai 2018, um die im obigen Text genannten Bedingungen für den Status der Erkennung doppelter Adressen und die bevorzugte Lebensdauer aufzunehmen]
Das folgende Beispiel zeigt die Filterung basierend auf dem Betriebsstatus, der Adressfamilie, ausgenommen die Loopback-Adresse (127.0.0.1), den Erkennungsstatus für doppelte Adressen und die bevorzugte Lebensdauer.
quelle
quelle
Habe das gerade auf meinem Computer getestet und es funktioniert.
quelle
Wenn Sie die Verwendung von DNS vermeiden möchten:
quelle
Verlassen Sie sich nicht die ganze Zeit auf InterNetwork, da Sie mehr als ein Gerät haben können, das auch IP4 verwendet, was die Ergebnisse beim Abrufen Ihrer IP vermasseln würde. Wenn Sie möchten, können Sie dies einfach kopieren und überprüfen oder aktualisieren, wie Sie es für richtig halten.
Zuerst erhalte ich die Adresse des Routers (Gateways). Wenn sich herausstellt, dass ich mit einem Gateway verbunden bin (was bedeutet, dass ich nicht direkt mit dem Modem verbunden bin oder nicht), haben wir unsere Gateway-Adresse als IPAddress, andernfalls haben wir eine IPAddress-Referenz mit einem Nullzeiger .
Dann müssen wir die Liste der IP-Adressen des Computers abrufen. Hier ist es nicht so schwer, weil Router (alle Router) 4 Bytes (...) verwenden. Die ersten drei sind am wichtigsten, da jeder angeschlossene Computer eine IP4-Adresse hat, die mit den ersten drei Bytes übereinstimmt. Beispiel: 192.168.0.1 ist Standard für die Standard-IP des Routers, sofern dies nicht vom Administrator geändert wurde. '192.168.0' oder was auch immer sie sein mögen, ist das, was wir zusammenbringen müssen. Und das ist alles, was ich in der IsAddressOfGateway-Funktion getan habe. Der Grund für die Längenanpassung liegt darin, dass nicht alle Adressen (die nur für den Computer bestimmt sind) eine Länge von 4 Byte haben. Wenn Sie netstat in das cmd eingeben, werden Sie feststellen, dass dies wahr ist. Da haben Sie es also. Ja, es erfordert etwas mehr Arbeit, um wirklich das zu bekommen, wonach Sie suchen. Prozess der Eliminierung. Und um Gottes willen, Finden Sie die Adresse nicht durch Pingen, was einige Zeit in Anspruch nimmt, da Sie zuerst die zu pingende Adresse senden und dann das Ergebnis zurücksenden müssen. Nein, arbeiten Sie direkt mit .NET-Klassen, die sich mit Ihrer Systemumgebung befassen, und Sie erhalten die Antworten, nach denen Sie suchen, wenn dies ausschließlich mit Ihrem Computer zu tun hat.
Wenn Sie jetzt direkt mit Ihrem Modem verbunden sind, ist der Vorgang fast der gleiche, da das Modem Ihr Gateway ist, die Submaske jedoch nicht derselbe, da Sie die Informationen direkt von Ihrem DNS-Server über ein Modem erhalten und nicht vom Router maskiert werden, der das Modem bedient Internet für Sie, obwohl Sie immer noch denselben Code verwenden können, da das letzte Byte der dem Modem zugewiesenen IP 1 ist. Wenn also die vom Modem gesendete IP, die sich ändert, 111.111.111.1 'lautet, erhalten Sie 111.111.111 (einige) Bytewert). Beachten Sie, dass wir die Gateway-Informationen finden müssen, da es mehr Geräte gibt, die sich mit Internetverbindungen befassen als Ihr Router und Modem.
Jetzt sehen Sie, warum Sie die ersten beiden Bytes 192 und 168 Ihres Routers NICHT ändern. Diese werden nur für Router und nicht für die Internetnutzung streng unterschieden. Andernfalls besteht ein ernstes Problem mit dem IP-Protokoll und doppeltem Ping, das zum Absturz Ihres Computers führt. Stellen Sie sich vor, dass Ihre zugewiesene Router-IP 192.168.44.103 lautet und Sie auch auf eine Site mit dieser IP klicken. OH MEIN GOTT! Ihr Computer würde nicht wissen, was er pingen soll. Absturz genau dort. Um dieses Problem zu vermeiden, werden nur Router zugewiesen und nicht für die Internetnutzung. Lassen Sie also die ersten zwei Bytes des Routers in Ruhe.
quelle
255.255.255.0
, und dies auf ziemlich komplizierte Weise, IMO.Ich dachte nur, ich würde meinen eigenen Einzeiler hinzufügen (obwohl es bereits viele andere nützliche Antworten gibt).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
quelle
Um die aktuelle öffentliche IP-Adresse abzurufen, müssen Sie lediglich eine ASPX-Seite mit der folgenden Zeile im Seitenladeereignis erstellen:
quelle
Wenn Sie im Intranet arbeiten, können Sie die IP-Adresse des lokalen Computers abrufen. Wenn nicht, erhalten Sie die externe IP-Adresse wie folgt: Web:
Desktop:
quelle
Schau hier für Details.
Sie müssen sich daran erinnern, dass Ihr Computer mehr als eine IP haben kann (eigentlich immer) - also nach welcher suchen Sie?
quelle
Versuche dies:
quelle
Möglicherweise können Sie dies anhand einer externen IP-Adresse in Betracht ziehen (wenn Sie sich in einem Webserverkontext befinden)
Ich habe die gleiche Frage gestellt wie Sie und sie in diesem Artikel über Stapelüberläufe gefunden.
Es hat bei mir funktioniert.
quelle
quelle
quelle
Einfache einzelne Codezeile, die die erste interne IPV4-Adresse zurückgibt oder null, wenn keine vorhanden sind. Wurde oben als Kommentar hinzugefügt, kann aber für jemanden nützlich sein (einige der oben genannten Lösungen geben mehrere Adressen zurück, die weiter gefiltert werden müssen).
Es ist auch einfach, Loopback anstelle von Null zurückzugeben, denke ich mit:
quelle
IPAddress.Loopback
? :)Um die IP-Adressliste zu finden, habe ich diese Lösung verwendet
Aber ich persönlich mag die folgende Lösung, um eine lokal gültige IP-Adresse zu erhalten
quelle
Die LINQ-Lösung:
quelle
Hier ist, wie ich es gelöst habe. Ich weiß, wenn Sie mehrere physische Schnittstellen haben, kann dies sein, dass Sie nicht genau das Eth auswählen, das Sie möchten.
quelle
Die Frage sagt nicht ASP.NET MVC, aber ich lasse dies trotzdem hier:
quelle
Holen Sie sich alle IP-Adressen als Zeichenfolgen mit LINQ:
PRIVATE AUSFILTERN ...
Definieren Sie zunächst eine Erweiterungsmethode
IsPrivate()
:... und dann damit private IPs herausfiltern:
quelle
Es funktioniert für mich ... und sollte in den meisten Fällen (wenn nicht allen) schneller sein als das Abfragen eines DNS-Servers. Vielen Dank an Dr. Wily's Apprentice ( hier ).
Nur als Referenz ist dies der vollständige Klassencode, in dem ich ihn definiert habe:
quelle
Eine weitere Möglichkeit, Ihre öffentliche IP-Adresse abzurufen, besteht darin, den OpenDNS-
resolve1.opendns.com
Servermyip.opendns.com
als Anforderung zu verwenden.In der Befehlszeile lautet dies:
Oder in C # mit dem DNSClient-Nuget:
Dies ist etwas sauberer als das Erreichen von http-Endpunkten und das Parsen von Antworten.
quelle
Und dies dient dazu, alle lokalen IPs im CSV-Format in VB.NET abzurufen
quelle
Um die Remote-IP-Adresse so schnell wie möglich zu erhalten. Sie müssen einen Downloader verwenden oder einen Server auf Ihrem Computer erstellen.
Der Nachteil bei der Verwendung dieses einfachen Codes: (empfohlen) ist, dass das Abrufen Ihrer Remote-IP-Adresse 3-5 Sekunden dauert, da der WebClient bei der Initialisierung immer 3-5 Sekunden benötigt, um Ihre Proxy-Einstellungen zu überprüfen.
Hier ist, wie ich es behoben habe .. (das erste Mal dauert immer noch 3-5 Sekunden), aber danach erhält es Ihre Remote-IP-Adresse immer in 0-2 Sekunden, abhängig von Ihrer Verbindung.
quelle