Im Internet gibt es mehrere Stellen, die Ihnen zeigen, wie Sie eine IP-Adresse erhalten. Und viele von ihnen sehen wie folgt aus:
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();
In diesem Beispiel erhalte ich mehrere IP-Adressen, aber ich bin nur daran interessiert, die zu erhalten, die der Router dem Computer zuweist, auf dem das Programm ausgeführt wird: die IP, die ich jemandem geben würde, wenn er auf einen freigegebenen Ordner auf meinem Computer zugreifen möchte Beispiel.
Wenn ich nicht mit einem Netzwerk verbunden bin und über ein Modem ohne Router direkt mit dem Internet verbunden bin, möchte ich eine Fehlermeldung erhalten. Wie kann ich feststellen, ob mein Computer mit C # mit einem Netzwerk verbunden ist und ob dann die LAN-IP-Adresse abgerufen werden soll?
c#
networking
Tono Nam
quelle
quelle
If I am not connected to a network and I am connected to the internet
Diese Aussage scheint widersprüchlich. Versuchen Sie herauszufinden, ob Ihr Computer mit einem privaten LAN oder dem Internet verbunden ist?Antworten:
So erhalten Sie die lokale IP-Adresse:
So überprüfen Sie, ob Sie verbunden sind oder nicht:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
quelle
Es gibt einen genaueren Weg, wenn auf dem lokalen Computer mehrere IP-Adressen verfügbar sind.
Connect
einen UDP-Socket und lesen Sie seinen lokalen Endpunkt:Connect
Ein UDP-Socket hat folgenden Effekt: Er legt das Ziel fürSend
/ festRecv
, verwirft alle Pakete von anderen Adressen und versetzt den Socket - was wir verwenden - in den Status "verbunden" und stellt die entsprechenden Felder ein. Dies umfasst das Überprüfen des Vorhandenseins der Route zum Ziel gemäß der Routing-Tabelle des Systems und das entsprechende Festlegen des lokalen Endpunkts. Der letzte Teil scheint offiziell nicht dokumentiert zu sein, aber es scheint ein integraler Bestandteil der Berkeley-Sockets-API zu sein (ein Nebeneffekt des UDP-Status "verbunden"), der sowohl unter Windows als auch unter Linux über Versionen und Distributionen hinweg zuverlässig funktioniert .Diese Methode gibt also die lokale Adresse an, die für die Verbindung mit dem angegebenen Remote-Host verwendet wird. Es wurde keine echte Verbindung hergestellt, daher kann die angegebene Remote-IP nicht erreichbar sein.
quelle
Überarbeitung des Mrcheif-Codes zur Nutzung von Linq (dh .Net 3.0+). .
:) :)
quelle
Ich weiß, dass dies ein totes Pferd treten kann, aber vielleicht kann dies jemandem helfen. Ich habe überall nach einer Möglichkeit gesucht, meine lokale IP-Adresse zu finden, aber überall, wo ich sie finde, heißt es:
Ich mag das überhaupt nicht, weil es nur alle Adressen erhält, die Ihrem Computer zugewiesen sind. Wenn Sie mehrere Netzwerkschnittstellen haben (was heutzutage so gut wie alle Computer tun), wissen Sie nicht, welche Adresse zu welcher Netzwerkschnittstelle gehört. Nachdem ich einige Nachforschungen angestellt hatte, erstellte ich eine Funktion zur Verwendung der NetworkInterface-Klasse und riss die Informationen heraus. Auf diese Weise kann ich feststellen, um welche Art von Schnittstelle es sich handelt (Ethernet, Wireless, Loopback, Tunnel usw.), ob sie aktiv ist oder nicht, und SOOO viel mehr.
So rufen Sie jetzt die IPv4-Adresse Ihres Ethernet-Netzwerkschnittstellenaufrufs ab:
Oder Ihre drahtlose Schnittstelle:
Wenn Sie versuchen, eine IPv4-Adresse für eine drahtlose Schnittstelle abzurufen, auf Ihrem Computer jedoch keine drahtlose Karte installiert ist, wird nur eine leere Zeichenfolge zurückgegeben. Gleiches gilt für die Ethernet-Schnittstelle.
Hoffe das hilft jemandem! :-)
BEARBEITEN:
Es wurde darauf hingewiesen (danke @NasBanov), dass diese Funktion zwar das Extrahieren der IP-Adresse auf viel bessere Weise als die Verwendung ermöglicht
Dns.GetHostEntry(Dns.GetHostName())
, jedoch nicht sehr gut mehrere Schnittstellen desselben Typs oder mehrere IP-Adressen auf einer einzigen Schnittstelle unterstützt . Es wird nur eine einzige IP-Adresse zurückgegeben, wenn möglicherweise mehrere Adressen zugewiesen sind. Um ALLE diese zugewiesenen Adressen zurückzugeben, können Sie einfach die ursprüngliche Funktion manipulieren, um immer ein Array anstelle einer einzelnen Zeichenfolge zurückzugeben. Zum Beispiel:Diese Funktion gibt nun ALLE zugewiesenen Adressen für einen bestimmten Schnittstellentyp zurück. Um nur eine einzelne Zeichenfolge zu erhalten, können Sie die
.FirstOrDefault()
Erweiterung verwenden, um das erste Element im Array zurückzugeben, oder, wenn es leer ist, eine leere Zeichenfolge zurückgeben.quelle
item.OperationalStatus
immer zurückgegebenUnknown
.Hier ist eine modifizierte Version (von der von compman2408), die für mich funktioniert hat:
Sie können diese Methode beispielsweise wie folgt aufrufen:
Die Änderung: Ich rufe die IP von einem Adapter ab, dem eine Gateway-IP zugewiesen ist. Zweite Änderung: Ich habe docstrings und break-Anweisungen hinzugefügt, um diese Methode effizienter zu gestalten.
quelle
break
im Innerstenif
oder einreturn
würde den Trick tun.Dies ist der beste Code, den ich gefunden habe, um die aktuelle IP-Adresse abzurufen, um zu vermeiden, dass ein VMWare-Host oder eine andere ungültige IP-Adresse abgerufen wird.
quelle
Ich denke, die Verwendung von LinQ ist einfacher:
quelle
Zum Lachen dachte ich, ich würde versuchen, eine einzelne LINQ-Anweisung zu erhalten, indem ich den neuen nullbedingten C # 6-Operator verwende. Sieht ziemlich verrückt und wahrscheinlich schrecklich ineffizient aus, aber es funktioniert.
Logik mit freundlicher Genehmigung von
Gerardo H
(und durch Bezugnahmecompman2408
).quelle
Andere Möglichkeit, IP mithilfe des linq-Ausdrucks abzurufen:
quelle
@mrcheif Ich habe diese Antwort heute gefunden und sie war sehr nützlich, obwohl sie eine falsche IP-Adresse zurückgegeben hat (nicht, weil der Code nicht funktioniert), aber sie hat die falsche IP-Adresse für das Netzwerk angegeben, wenn Himachi ausgeführt wird.
quelle
192.0.0.0/8
nicht nur kein korrekter Test für eine private IP-Adresse (es gibt 3 Bereiche, die sich alle von diesem unterscheiden), es kann auch ein Unternehmensnetzwerkbereich sein, also nicht so sehr "lokal".Getestet mit einer oder mehreren LAN-Karten und virtuellen Maschinen
quelle
Nur eine aktualisierte Version von mir mit LINQ:
quelle
Voraussetzungen: Sie müssen die System.Data.Linq-Referenz hinzufügen und darauf verweisen
quelle
Ich hatte auch Probleme, die richtige IP zu erhalten.
Ich habe hier verschiedene Lösungen ausprobiert, aber keine hat mir den gewünschten Effekt gebracht. Bei fast allen bereitgestellten bedingten Tests wurde keine Adresse verwendet.
Das hat bei mir funktioniert, hoffe es hilft ...
quelle
quelle
Beachten Sie, dass im Allgemeinen mehrere NAT-Übersetzungen und mehrere DNS-Server ausgeführt werden können, die jeweils auf unterschiedlichen NAT-Übersetzungsebenen ausgeführt werden.
Was ist, wenn Sie über NAT mit Carrier-Qualität verfügen und mit anderen Kunden desselben Carriers kommunizieren möchten? Im Allgemeinen wissen Sie es nie genau, da Sie bei jeder NAT-Übersetzung möglicherweise mit unterschiedlichen Hostnamen angezeigt werden.
quelle
Veraltet weg, das funktioniert bei mir
quelle
Wenn wir die Antwort von Mrchief mit Linq aktualisieren, haben wir:
quelle
Dies gibt Adressen von allen Schnittstellen zurück, die Gateway-Adressen und Unicast-Adressen in zwei separaten Listen haben, IPV4 und IPV6.
quelle
Es gibt bereits viele Antworten, aber ich trage immer noch meine bei:
Einzeiler:
Hinweis: Suchen Sie nach dem letzten, da es nach einigen dem Gerät hinzugefügten Schnittstellen wie MobileHotspot, VPN oder anderen ausgefallenen virtuellen Adaptern immer noch funktioniert hat.
quelle
Außerdem nur einfacher Code zum Abrufen der Client-IP:
Hoffe es hilft dir.
quelle
quelle
Der Code von compman2408 wurde geändert, um ihn jeweils durchlaufen zu können
NetworkInterfaceType
.Und man kann es so nennen:
quelle
Unter der gleichen Aktion
Funktion LocalIP ()
Host als Zeichenfolge dimmen = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Geben Sie True zurück
Funktion beenden
quelle
eine Codezeile: D.
quelle
Wenn Sie über virtuelle Maschinen oder zusätzliche Netzwerkkarten verfügen, enthält die Adressliste möglicherweise andere Werte. Mein Vorschlag ist, die Einträge der Adressliste zu überprüfen und entsprechend zu drucken. In meinem Fall war Eintrag 3 die IPv4-Adresse meines Computers
Vergiss nicht hinzuzufügen
using System.Net;
quelle