389 Stimmen

Lokale IP-Adresse abrufen

Im Internet gibt es mehrere Stellen, die zeigen, wie man eine IP-Adresse erhält. Und viele von ihnen sehen so aus wie dieses Beispiel:

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

Bei diesem Beispiel erhalte ich mehrere IP-Adressen, aber ich bin nur an derjenigen interessiert, die der Router dem Computer zuweist, auf dem das Programm läuft: die IP, die ich jemandem geben würde, wenn er z. B. auf einen freigegebenen Ordner auf meinem Computer zugreifen möchte.

Wenn ich nicht an ein Netzwerk angeschlossen bin und direkt über ein Modem ohne Router mit dem Internet verbunden bin, möchte ich eine Fehlermeldung erhalten. Wie kann ich sehen, wenn mein Computer mit einem Netzwerk mit C# verbunden ist und wenn es dann die LAN-IP-Adresse zu erhalten.

7voto

Jordan Trainor Punkte 2360

@mrcheif Ich habe heute diese Antwort gefunden, und sie war sehr nützlich, obwohl sie eine falsche IP zurückgab (nicht weil der Code nicht funktionierte), sondern weil sie die falsche Internetnetzwerk-IP angab, wenn man Dinge wie Himachi laufen hat.

public static string localIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());

    foreach (IPAddress ip in host.AddressList)
    {
        localIP = ip.ToString();

        string[] temp = localIP.Split('.');

        if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192")
        {
            break;
        }
        else
        {
            localIP = null;
        }
    }

    return localIP;
}

5voto

Giusepe Punkte 646

Nur eine aktualisierte Version von mir mit LINQ:

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}

4voto

UberBiza Punkte 73

Ich hatte auch Schwierigkeiten, die richtige IP zu erhalten.

Ich habe verschiedene Lösungen ausprobiert, aber keine hat den gewünschten Erfolg gebracht. Fast alle bedingten Tests, die angeboten wurden, führten dazu, dass keine Adresse verwendet wurde.

So hat es bei mir funktioniert, ich hoffe, es hilft...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);

3voto

pola Punkte 389

Voraussetzungen: Sie müssen einen Verweis auf System.Data.Linq hinzufügen und auf diesen verweisen.

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

3voto

Andrew Hendrix Punkte 21

Mit diesen:

using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Linq;

Sie können eine Reihe von LINQ-Methoden verwenden, um die bevorzugte IP-Adresse zu ermitteln.

public static bool IsIPv4(IPAddress ipa) => ipa.AddressFamily == AddressFamily.InterNetwork;

public static IPAddress GetMainIPv4() => NetworkInterface.GetAllNetworkInterfaces()
.Select((ni)=>ni.GetIPProperties())
.Where((ip)=> ip.GatewayAddresses.Where((ga) => IsIPv4(ga.Address)).Count() > 0)
.FirstOrDefault()?.UnicastAddresses?
.Where((ua) => IsIPv4(ua.Address))?.FirstOrDefault()?.Address;

Damit wird einfach die erste Netzwerkschnittstelle gefunden, die ein IPv4-Standardgateway hat, und die erste IPv4-Adresse auf dieser Schnittstelle abgerufen. Netzwerkstacks sind so konzipiert, dass sie nur einen Standard-Gateway haben, und daher ist derjenige mit einem Standard-Gateway der beste.

WARNUNG: Wenn Sie eine anormale Konfiguration haben, bei der der Hauptadapter mehr als eine IPv4-Adresse hat, wird diese wird greifen nur die primero ein. (Die Lösung zu greifen die beste in diesem Szenario beinhaltet greifen die Gateway-IP, und überprüfen, um zu sehen, welche Unicast-IP im gleichen Subnetz wie die Gateway-IP-Adresse ist, die unsere Fähigkeit, eine hübsche LINQ-Methode basierte Lösung zu erstellen, sowie als eine Menge mehr Code töten würde)

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