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

365

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?

Nefzen
quelle
1
In Bezug auf die externe IP-Adresse glaube ich nicht, dass es einen lokalen Ansatz gibt, um diese abzurufen. Der localhost befindet sich möglicherweise hinter einem NAT-Router, der lokale Netzwerkadressen in öffentliche übersetzt. Gibt es eine (lokale) Möglichkeit, um zu überprüfen, ob dies der Fall ist? Ich kenne keine ...
Thiago Arrais
Das Beispiel verwendet das DNS, um die IP-Adresse zu erhalten. Ich habe Erfahrung mit DNS mit falschen Informationen. In diesem Fall könnte die Stichprobe mit falschen Informationen antworten .
Leiflundgren
@leiflundgren Ich habe auch Erfahrung mit DNS mit falschen Informationen. Meine Antwort beschreibt, wie ich die IP-Adresse erhalten habe, die ich benötigt habe, ohne mich auf DNS verlassen zu müssen, als ich mit dieser Situation konfrontiert war.
Dr. Wily's Apprentice
13
Verwenden von LINQ:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Luis Perez
2
Dies ist eine typische Situation, in der Benutzer mit völlig unterschiedlichen Anforderungen dazu neigen, dieselbe Frage zu stellen. Einige Leute möchten wissen, wie ihr Computer über das öffentliche Netzwerk erreichbar ist. Die kanonische Antwort lautet STUN , obwohl viele mit Hacks antworten, die von zufälligen Dritten abhängig sind. Einige Leute möchten nur ihre IP-Adresse (n) in lokalen Netzwerken kennen. Gute Antworten in diesem Fall erwähnen die NetworkInterface.GetAllNetworkInterfaces-Methode .
Stéphane Gourichon

Antworten:

237

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:

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

dazu:

if (ip.AddressFamily == AddressFamily.InterNetwork)

ToStringZum Vergleich ist keine Aufzählung erforderlich .

Andrew Hare
quelle
3
Ich möchte die externe IP-Adresse, wenn möglich. Ich nehme an, es wird nicht so möglich sein, wenn ich hinter NAT stehe.
Nefzen
3
Nein, Ihr Computer kennt nur die NAT-Adresse.
Andrew Hare
1
Ich bin mir ziemlich sicher, dass Sie einen externen Server für die externe Adresse erreichen müssen.
Thiago Arrais
29
Ich würde auch eine breakErklä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)
Eric J.
7
Beachten Sie, dass dies fehlschlagen kann, wenn eine Maschine über mehrere 'InterNetwork'-Ports verfügt (in meinem Fall: eine Ethernet-Karte und ein Port einer virtuellen Maschine). Der aktuelle Code gibt Ihnen die letzte IP in der Liste.
Christian Studer
168

Die einzige Möglichkeit, Ihre öffentliche IP-Adresse zu ermitteln, besteht darin, jemanden zu bitten, Ihnen dies mitzuteilen. Dieser Code kann Ihnen 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;
}
Ezgar
quelle
20
Wissen Sie, dass Ihr Codebeispiel in Frage 13 20 C # -Fragen der Microsoft Academy erwähnt wurde? Der Moderator entschuldigt sich für den Diebstahl Ihres Codes. Ab 8:30 Minuten. Sehen Sie das . :)
Erwin Rooijakkers
4
Leider ist der Link tot.
Barry Guvenkaya
Neuer Link für den Fall, dass jemand ihn sehen möchte
Kimmax
1
Bitte benutzen Sie den Link ipof.in/txt, damit Sie die IP direkt ohne den gesamten HTML-Parsing-Code erhalten können
vivekv
82

Sauberer und alles in einem: D.

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
Mohammed A. Fadil
quelle
3
Probleme mit diesem Code: * Es wird davon ausgegangen, dass ein Computer nur eine einzige IP-Adresse hat. Viele haben mehrere. * Es werden nur IPV4-Adressen berücksichtigt. Fügen Sie InterNetworkV6 hinzu, um IPV6 einzuschließen.
Robert Bratton
1
@ RobertBratton, vielen Dank für Ihre Wiederholung. Das Problem hat keine Multi-IP-Adresse oder IPV6 angenommen. Mit geringfügigen Änderungen an diesem Code können bestimmte Probleme behoben werden.
Mohammed A. Fadil
50

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:

  • Filtern Sie alle inaktiven NetworkInterfaces heraus, indem Sie nach suchen 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 .

  • Filtern Sie nicht bevorzugte Unicast-Adressen heraus, indem Sie nach suchen DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • Filtern Sie "virtuelle" Adressen heraus, indem Sie nach suchen 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.

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);
}
Dr. Wily's Lehrling
quelle
2
In diesem speziellen Fall wollte das OP seine externe IP-Adresse sehen, daher ist die DNS-Lösung wahrscheinlich der richtige Weg. Für die Iteration lokaler IP-Adressen empfehle ich diesen Ansatz.
Matt Davis
3
Einverstanden, dass DNS ein einfacher Weg ist, um die IP-Adresse zu erhalten. Ich habe in meiner Antwort erwähnt, dass dieser Ansatz funktioniert, wenn Ihr DNS unzuverlässig ist. Ich habe dies in einer Umgebung verwendet, in der DNS so durcheinander gebracht wurde, dass DNS beim Verschieben eines Computers von einem Ethernet-Port auf einen anderen immer noch die alte IP-Adresse meldet, sodass sie für meine Zwecke nahezu unbrauchbar ist.
Dr. Wily Lehrling
Ich freue mich über die Beschreibung, aber Sie hätten auch das Codebeispiel veröffentlichen sollen.
Aidin
Großartig, danke. Beachten Sie, dass nach dem letzten Windows-Update UnicastAddresses. Erste Annahme gilt nicht mehr. Ich muss jetzt alle UnicastAddress für jeden Adapter mit weiterer Filterung unter Verwendung von AddressPreferredLifetime und DuplicateAddressDetectionStation (in Ihrem obigen Text erwähnt)
überprüfen
37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");
James
quelle
ifconfig.me/ip funktioniert nicht mehr. Versuchen Sie stattdessen api.ipify.org oder den Link in Dougs Kommentar
Kenny83
16
using System.Net;

string host = Dns.GetHostName();
IPHostEntry ip = Dns.GetHostEntry(host);
Console.WriteLine(ip.AddressList[0].ToString());

Habe das gerade auf meinem Computer getestet und es funktioniert.

opedog
quelle
3
Es wird Ihnen eine lokale IP-Adresse geben, und die Frage bezieht sich auf die externe IP-Adresse, dh die IP-Adresse, mit der Sie im Internet surfen.
Sangram Nandkhile
15

Wenn Sie die Verwendung von DNS vermeiden möchten:

List<IPAddress> ipList = new List<IPAddress>();
foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (var address in netInterface.GetIPProperties().UnicastAddresses)
    {
        if (address.Address.AddressFamily == AddressFamily.InterNetwork)
        {
            Console.WriteLine("found IP " + address.Address.ToString());
            ipList.Add(address.Address);
        }
    }
}
reza
quelle
9

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.

static IPAddress FindLanAddress()
{
    IPAddress gateway = FindGetGatewayAddress();
    if (gateway == null)
        return null;

    IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress address in pIPAddress)            {
        if (IsAddressOfGateway(address, gateway))
                return address;
    return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
    if (address != null && gateway != null)
        return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
    return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
    if (address != null && gateway != null)
    {
        int gwLen = gateway.Length;
        if (gwLen > 0)
        {
            if (address.Length == gateway.Length)
            {
                --gwLen;
                int counter = 0;
                for (int i = 0; i < gwLen; i++)
                {
                    if (address[i] == gateway[i])
                        ++counter;
                }
                return (counter == gwLen);
            }
        }
    }
    return false;

}
static IPAddress FindGetGatewayAddress()
{
    IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();

    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipInfProps = ni.GetIPProperties();
        foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
            return gi.Address;
    }
    return null;
}
bvrwoo_3376
quelle
1
Dies macht keinen Sinn: foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses) return gi.Address;
Edwin Evans
3
Es gibt keine Garantie dafür, dass "jeder Computer, der an ein Gateway angeschlossen ist, die IP4-Adresse hat, die mit den ersten drei Bytes übereinstimmt". Dies hängt von der Subnetzmaske ab, die verschiedene Bitkombinationen enthalten kann. Außerdem müssen Startbytes nicht "192.168" sein, wie hier beschrieben . Dieser Code funktioniert nur, wenn die Subnetzmaske aktiviert ist 255.255.255.0, und dies auf ziemlich komplizierte Weise, IMO.
Groo
8

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");

bæltazor
quelle
4
Beachten Sie, dass dies einen potenziellen Speicherverlust zur Folge hat. Der WebClient wird nicht ordnungsgemäß entsorgt. Verwenden Sie stattdessen: using (var client = new WebClient ()) {return client.DownloadString (" icanhazip.com /"). Trim () ; }
FOO
4

Um die aktuelle öffentliche IP-Adresse abzurufen, müssen Sie lediglich eine ASPX-Seite mit der folgenden Zeile im Seitenladeereignis erstellen:

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());
Erkennen Sie die öffentliche IP-Adresse
quelle
4

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:

//this will bring the IP for the current machine on browser
System.Web.HttpContext.Current.Request.UserHostAddress

Desktop:

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
Guilherme Ferreira
quelle
3
namespace NKUtilities 
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    public class DNSUtility
    {
        public static int Main(string [] args)
        {
            string strHostName = "";
            try {

                if(args.Length == 0)
                {
                    // 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);
                }
                else
                {
                    // Otherwise, get the IP address of the host provided on the command line.
                    strHostName = args[0];
                }

                // 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());
                }
                return 0;

            } 
            catch(SocketException se) 
            {
                Console.WriteLine("{0} ({1})", se.Message, strHostName);
                return -1;
            } 
            catch(Exception ex) 
            {
                Console.WriteLine("Error: {0}.", ex.Message);
                return -1;
            }
        }
    }
}

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?

mfloryan
quelle
2

Versuche dies:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();
Die Maske
quelle
1
Dies gibt eine Reihe lokaler IP-Adressen zurück, von denen eine die IPv4-Adresse ist. Es ist jedoch schwierig, die richtige in der Liste zu finden.
Contango
1

Möglicherweise können Sie dies anhand einer externen IP-Adresse in Betracht ziehen (wenn Sie sich in einem Webserverkontext befinden)

Request.ServerVariables["LOCAL_ADDR"];

Ich habe die gleiche Frage gestellt wie Sie und sie in diesem Artikel über Stapelüberläufe gefunden.

Es hat bei mir funktioniert.

Juan Calero
quelle
1
namespace NKUtilities 
{
    using System;
    using System.Net;

    public class DNSUtility
    {
        public static int Main (string [] args)
        {

          String strHostName = new String ("");
          if (args.Length == 0)
          {
              // 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);
          }
          else
          {
              strHostName = args[0];
          }

          // Then using host name, get the IP address list..
          IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
          IPAddress [] addr = ipEntry.AddressList;

          for (int i = 0; i < addr.Length; i++)
          {
              Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
          }
          return 0;
        }    
     }
}
naani
quelle
1
using System;
using System.Net;

namespace IPADDRESS
{
    class Program
    {
        static void Main(string[] args)
        {
            String strHostName = string.Empty;
            if (args.Length == 0)
            {                
                /* First get the host name of local machine.*/
                strHostName = Dns.GetHostName();
                Console.WriteLine("Local Machine's Host Name: " + strHostName);
            }
            else
            {
                strHostName = args[0];
            }
            /* Then using host name, get the IP address list..*/
            IPHostEntry ipEntry = Dns.GetHostByName(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();
        }
    }
}
Sundram
quelle
1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

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:

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );
Wolf5370
quelle
1
Wie wäre es mit IPAddress.Loopback? :)
CodeTherapist
1

Um die IP-Adressliste zu finden, habe ich diese Lösung verwendet

public static IEnumerable<string> GetAddresses()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}

Aber ich persönlich mag die folgende Lösung, um eine lokal gültige IP-Adresse zu erhalten

public static IPAddress GetIPAddress(string hostName)
{
    Ping ping = new Ping();
    var replay = ping.Send(hostName);

    if (replay.Status == IPStatus.Success)
    {
        return replay.Address;
    }
    return null;
 }

public static void Main()
{
    Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName()));
    Console.WriteLine("Google IP:" + GetIPAddress("google.com");
    Console.ReadLine();
}
Ravi Shankar
quelle
1

Die LINQ-Lösung:

Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(ip => ip.ToString()).FirstOrDefault() ?? ""
Serge
quelle
1

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.

private string FetchIP()
{
    //Get all IP registered
    List<string> IPList = new List<string>();
    IPHostEntry host;
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            IPList.Add(ip.ToString());
        }
    }

    //Find the first IP which is not only local
    foreach (string a in IPList)
    {
        Ping p = new Ping();
        string[] b = a.Split('.');
        string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1";
        PingReply t = p.Send(ip2);
        p.Dispose();
        if (t.Status == IPStatus.Success && ip2 != a)
        {
            return a;
        }
    }
    return null;
}
Thomas Andreè Wang
quelle
1

Die Frage sagt nicht ASP.NET MVC, aber ich lasse dies trotzdem hier:

Request.UserHostAddress
Barry Guvenkaya
quelle
1

Holen Sie sich alle IP-Adressen als Zeichenfolgen mit LINQ:

using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
...
string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork)
        .Select(d=>d.Address.ToString())
    ).ToArray();

PRIVATE AUSFILTERN ...

Definieren Sie zunächst eine Erweiterungsmethode IsPrivate():

public static class IPAddressExtensions
{
    // Collection of private CIDRs (IpAddress/Mask) 
    private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}
        .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress
                                    .Parse(c.Split('/')[0]).GetAddressBytes(), 0)
                              , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1])))))
        .ToArray();
    public static bool IsPrivate(this IPAddress ipAddress)
    {
        int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0);
        return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2));           
    }
}

... und dann damit private IPs herausfiltern:

string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork
            && !d.Address.IsPrivate() // Filter out private ones
        )
        .Select(d=>d.Address.ToString())
    ).ToArray();
Diego
quelle
1

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 ).

// ************************************************************************
/// <summary>
/// Will search for the an active NetworkInterafce that has a Gateway, otherwise
/// it will fallback to try from the DNS which is not safe.
/// </summary>
/// <returns></returns>
public static NetworkInterface GetMainNetworkInterface()
{
    List<NetworkInterface> candidates = new List<NetworkInterface>();

    if (NetworkInterface.GetIsNetworkAvailable())
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (
            NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
                candidates.Add(ni);
        }
    }

    if (candidates.Count == 1)
    {
        return candidates[0];
    }

    // Accoring to our tech, the main NetworkInterface should have a Gateway 
    // and it should be the ony one with a gateway.
    if (candidates.Count > 1)
    {
        for (int n = candidates.Count - 1; n >= 0; n--)
        {
            if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
            {
                candidates.RemoveAt(n);
            }
        }

        if (candidates.Count == 1)
        {
            return candidates[0];
        }
    }

    // Fallback to try by getting my ipAdress from the dns
    IPAddress myMainIpAdress = null;
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
        {
            myMainIpAdress = ip;
            break;
        }
    }

    if (myMainIpAdress != null)
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.Address.Equals(myMainIpAdress))
                    {
                        return ni;
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// AddressFamily.InterNetwork = IPv4
/// Thanks to Dr. Wilys Apprentice at
/// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
/// using System.Net.NetworkInformation;
/// </summary>
/// <param name="mac"></param>
/// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
/// <returns></returns>
public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
{
    NetworkInterface[] NetworkInterfaces =
        NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface ni in NetworkInterfaces)
    {
        if (ni.GetPhysicalAddress().Equals(mac))
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                    {
                        if (ai.Address.AddressFamily == addressFamily)
                        {
                            return ai.Address;
                        }
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
/// '?.ToString() ?? ""' on the result.
/// </summary>
/// <returns></returns>
public static IPAddress GetMyInternetIpAddress()
{
    NetworkInterface ni = GetMainNetworkInterface();
    IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
    if (ipAddress == null) // could it be possible ?
    {
        ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
    }

    return ipAddress;
}

// ******************************************************************

Nur als Referenz ist dies der vollständige Klassencode, in dem ich ihn definiert habe:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace TcpMonitor
{
    /*
        Usage:
                var cons = TcpHelper.GetAllTCPConnections();
                foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ...
    */

    public class NetHelper
    {
        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0);

        public enum UDP_TABLE_CLASS
        {
            UDP_TABLE_BASIC,
            UDP_TABLE_OWNER_PID,
            UDP_TABLE_OWNER_MODULE
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPROW_OWNER_PID
        {
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;
            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, localScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections()
        {
            return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET);
        }

        public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections()
        {
            return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
            IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(udpTablePtr);
            }

            return result;
        }

        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0);



        public enum MIB_TCP_STATE
        {
            MIB_TCP_STATE_CLOSED = 1,
            MIB_TCP_STATE_LISTEN = 2,
            MIB_TCP_STATE_SYN_SENT = 3,
            MIB_TCP_STATE_SYN_RCVD = 4,
            MIB_TCP_STATE_ESTAB = 5,
            MIB_TCP_STATE_FIN_WAIT1 = 6,
            MIB_TCP_STATE_FIN_WAIT2 = 7,
            MIB_TCP_STATE_CLOSE_WAIT = 8,
            MIB_TCP_STATE_CLOSING = 9,
            MIB_TCP_STATE_LAST_ACK = 10,
            MIB_TCP_STATE_TIME_WAIT = 11,
            MIB_TCP_STATE_DELETE_TCB = 12
        }

        public enum TCP_TABLE_CLASS
        {
            TCP_TABLE_BASIC_LISTENER,
            TCP_TABLE_BASIC_CONNECTIONS,
            TCP_TABLE_BASIC_ALL,
            TCP_TABLE_OWNER_PID_LISTENER,
            TCP_TABLE_OWNER_PID_CONNECTIONS,
            TCP_TABLE_OWNER_PID_ALL,
            TCP_TABLE_OWNER_MODULE_LISTENER,
            TCP_TABLE_OWNER_MODULE_CONNECTIONS,
            TCP_TABLE_OWNER_MODULE_ALL
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPROW_OWNER_PID
        {
            public uint state;
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint remoteAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0);
                }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr); }
            }

            public ushort RemotePort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0);
                }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] remoteAddr;
            public uint remoteScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint state;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public long LocalScopeId
            {
                get { return localScopeId; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, LocalScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }

            public long RemoteScopeId
            {
                get { return remoteScopeId; }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr, RemoteScopeId); }
            }

            public ushort RemotePort
            {
                get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork
        public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

        public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync()
        {
            return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET));
        }

        public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()
        {
            return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);
        }

        public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync()
        {
            return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6));
        }

        public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()
        {
            return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
            IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(tcpTablePtr);
            }

            return result;
        }

        public static string GetTcpStateName(MIB_TCP_STATE state)
        {
            switch (state)
            {
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED:
                    return "Closed";
                case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN:
                    return "Listen";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT:
                    return "SynSent";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD:
                    return "SynReceived";
                case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB:
                    return "Established";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1:
                    return "FinWait 1";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2:
                    return "FinWait 2";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT:
                    return "CloseWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING:
                    return "Closing";
                case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK:
                    return "LastAck";
                case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT:
                    return "TimeWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB:
                    return "DeleteTCB";
                default:
                    return ((int)state).ToString();
            }
        }

        private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>();

        public const string UnknownHostName = "Unknown";

        // ******************************************************************
        public static string GetHostName(IPAddress ipAddress)
        {
            return GetHostName(ipAddress.ToString());
        }

        // ******************************************************************
        public static string GetHostName(string ipAddress)
        {
            string hostName = null;

            if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName))
            {
                try
                {
                    if (ipAddress == "0.0.0.0" || ipAddress == "::")
                    {
                        hostName = ipAddress;
                    }
                    else
                    {
                        hostName = Dns.GetHostEntry(ipAddress).HostName;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    hostName = UnknownHostName;
                }

                DicOfIpToHostName[ipAddress] = hostName;
            }

            return hostName;
        }

        // ************************************************************************
        /// <summary>
        /// Will search for the an active NetworkInterafce that has a Gateway, otherwise
        /// it will fallback to try from the DNS which is not safe.
        /// </summary>
        /// <returns></returns>
        public static NetworkInterface GetMainNetworkInterface()
        {
            List<NetworkInterface> candidates = new List<NetworkInterface>();

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (
                    NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                        candidates.Add(ni);
                }
            }

            if (candidates.Count == 1)
            {
                return candidates[0];
            }

            // Accoring to our tech, the main NetworkInterface should have a Gateway 
            // and it should be the ony one with a gateway.
            if (candidates.Count > 1)
            {
                for (int n = candidates.Count - 1; n >= 0; n--)
                {
                    if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
                    {
                        candidates.RemoveAt(n);
                    }
                }

                if (candidates.Count == 1)
                {
                    return candidates[0];
                }
            }

            // Fallback to try by getting my ipAdress from the dns
            IPAddress myMainIpAdress = null;
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
                {
                    myMainIpAdress = ip;
                    break;
                }
            }

            if (myMainIpAdress != null)
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.Address.Equals(myMainIpAdress))
                            {
                                return ni;
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// AddressFamily.InterNetwork = IPv4
        /// Thanks to Dr. Wilys Apprentice at
        /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
        /// using System.Net.NetworkInformation;
        /// </summary>
        /// <param name="mac"></param>
        /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
        /// <returns></returns>
        public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
        {
            NetworkInterface[] NetworkInterfaces =
                NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface ni in NetworkInterfaces)
            {
                if (ni.GetPhysicalAddress().Equals(mac))
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                            {
                                if (ai.Address.AddressFamily == addressFamily)
                                {
                                    return ai.Address;
                                }
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
        /// '?.ToString() ?? ""' on the result.
        /// </summary>
        /// <returns></returns>
        public static IPAddress GetMyInternetIpAddress()
        {
            NetworkInterface ni = GetMainNetworkInterface();
            IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
            if (ipAddress == null) // could it be possible ?
            {
                ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
            }

            return ipAddress;
        }

        // ******************************************************************
        public static bool IsBroadcastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.GetAddressBytes()[3] == 255;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return false; // NO broadcast in IPv6
            }

            return false;
        }

        // ******************************************************************
        public static bool IsMulticastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx
                return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return ipAddress.IsIPv6Multicast;
            }

            return false;
        }

        // ******************************************************************

    }
}
Eric Ouellet
quelle
1

Eine weitere Möglichkeit, Ihre öffentliche IP-Adresse abzurufen, besteht darin, den OpenDNS- resolve1.opendns.comServer myip.opendns.comals Anforderung zu verwenden.

In der Befehlszeile lautet dies:

  nslookup myip.opendns.com resolver1.opendns.com

Oder in C # mit dem DNSClient-Nuget:

  var lookup = new LookupClient(new IPAddress(new byte[] { 208, 67, 222, 222 }));
  var result = lookup.Query("myip.opendns.com", QueryType.ANY);

Dies ist etwas sauberer als das Erreichen von http-Endpunkten und das Parsen von Antworten.

Ian Mercer
quelle
0

Und dies dient dazu, alle lokalen IPs im CSV-Format in VB.NET abzurufen

Imports System.Net
Imports System.Net.Sockets

Function GetIPAddress() As String
    Dim ipList As List(Of String) = New List(Of String)
    Dim host As IPHostEntry
    Dim localIP As String = "?"
    host = Dns.GetHostEntry(Dns.GetHostName())
    For Each ip As IPAddress In host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            localIP = ip.ToString()
            ipList.Add(localIP)
        End If
    Next
    Dim ret As String = String.Join(",", ipList.ToArray)
    Return ret
End Function
Saurabh Kumar
quelle
0

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.

 public static string GetIP()
 {
            string externalIP = "";
            externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                           .Matches(externalIP)[0].ToString();
            return externalIP;
 }

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.

public static WebClient webclient = new WebClient();
public static string GetIP()
{
    string externalIP = "";
    externalIP = webclient.DownloadString("http://checkip.dyndns.org/");
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                   .Matches(externalIP)[0].ToString();
    return externalIP;
}
SSpoke
quelle
Warum das Downvote? Sie können keine schnellere oder bessere Antwort finden. Wenn Sie den WebClient jedes Mal neu initialisieren, führt dies zu einer großen Overhead-Verzögerung.
SSpoke