372 Stimmen

Wie erhalte ich die IP-Adresse des Servers, auf dem meine C#-Anwendung ausgeführt wird?

Ich betreibe einen Server, und ich möchte meine eigene IP-Adresse anzeigen.

Wie lautet die Syntax für die Ermittlung 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;

Allerdings misstraue ich dem Autor generell, und ich verstehe diesen Code nicht. Gibt es einen besseren Weg, dies zu tun?

240voto

Andrew Hare Punkte 332190

Nein, das ist so ziemlich der beste Weg, es zu tun. Als Maschine podría mehrere IP-Adressen haben, müssen Sie die Sammlung dieser Adressen durchgehen, um die richtige zu finden.

Bearbeiten: Das Einzige, was ich würde Änderung wäre, dies zu ändern:

if (ip.AddressFamily.ToString() == "InterNetwork")

dazu:

if (ip.AddressFamily == AddressFamily.InterNetwork)

Es besteht keine Notwendigkeit ToString eine Aufzählung zum Vergleich.

169voto

ezgar Punkte 1750

Die einzige Möglichkeit, Ihre öffentliche IP-Adresse herauszufinden, besteht darin, eine andere Person zu bitten, sie Ihnen mitzuteilen; dieser Code kann Ihnen dabei helfen:

public string GetPublicIP()
{
    String direction = "";
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }

    //Search for the ip in the html
    int first = direction.IndexOf("Address: ") + 9;
    int last = direction.LastIndexOf("</body>");
    direction = direction.Substring(first, last - first);

    return direction;
}

83voto

Mohammed A. Fadil Punkte 8875

Sauberer und eine All-in-One-Lösung :D

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

51voto

Wenn Sie sich nicht darauf verlassen können, dass Sie Ihre IP-Adresse von einem DNS-Server erhalten (was mir passiert ist), können Sie die folgende Methode verwenden:

Der Namespace System.Net.NetworkInformation enthält eine NetworkInterface-Klasse die eine statische GetAllNetworkInterfaces-Methode .

Diese Methode gibt alle "Netzwerkschnittstellen" auf Ihrem Rechner zurück, und davon gibt es in der Regel eine ganze Menge, selbst wenn Sie nur einen drahtlosen Adapter und/oder einen Ethernet-Adapter auf Ihrem Rechner installiert haben. Alle diese Netzwerkschnittstellen haben gültige IP-Adressen für Ihren lokalen Rechner, obwohl Sie wahrscheinlich nur eine haben wollen.

Wenn Sie nach einer IP-Adresse suchen, müssen Sie die Liste so lange filtern, bis Sie die richtige Adresse gefunden haben. Wahrscheinlich müssen Sie ein wenig experimentieren, aber ich hatte Erfolg mit dem folgenden Ansatz:

  • Filtern Sie alle Netzwerkschnittstellen heraus, die inaktiv sind, indem Sie auf OperationalStatus == OperationalStatus.Up . Dadurch wird z. B. Ihr physischer Ethernet-Adapter ausgeschlossen, wenn Sie kein Netzwerkkabel eingesteckt haben.

Für jedes NetworkInterface können Sie eine IPInterfaceProperties Objekt unter Verwendung der GetIPProperties-Methode und von einem IPInterfaceProperties-Objekt können Sie auf die UnicastAddresses-Eigenschaft für eine Liste von UnicastIPAddressInformation Objekte.

  • Ausfiltern von nicht bevorzugten Unicast-Adressen durch Überprüfung auf DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • Herausfiltern von "virtuellen" Adressen durch Überprüfung auf AddressPreferredLifetime != UInt32.MaxValue .

An diesem Punkt nehme ich die Adresse der ersten (wenn überhaupt) Unicast-Adresse, die allen diesen Filtern entspricht.

EDIT:

(überarbeiteter Code vom 16. Mai 2018, um die im obigen Text genannten Bedingungen für den Zustand der doppelten Adresserkennung und die bevorzugte Lebensdauer aufzunehmen)

Das folgende Beispiel zeigt die Filterung auf der Grundlage des Betriebsstatus, der Adressfamilie, mit Ausnahme der Loopback-Adresse (127.0.0.1), des Status der Erkennung doppelter Adressen und der bevorzugten Lebensdauer.

static IEnumerable<IPAddress> GetLocalIpAddresses()
{
    // Get the list of network interfaces for the local computer.
    var adapters = NetworkInterface.GetAllNetworkInterfaces();

    // Return the list of local IPv4 addresses excluding the local
    // host, disconnected, and virtual addresses.
    return (from adapter in adapters
            let properties = adapter.GetIPProperties()
            from address in properties.UnicastAddresses
            where adapter.OperationalStatus == OperationalStatus.Up &&
                  address.Address.AddressFamily == AddressFamily.InterNetwork &&
                  !address.Equals(IPAddress.Loopback) &&
                  address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
                  address.AddressPreferredLifetime != UInt32.MaxValue
            select address.Address);
}

37voto

James Punkte 403
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X