Frage

muß ich herausfinden, die externe IP-Adresse des Computers eine C # Anwendung läuft.

Bei der Anwendung habe ich eine Verbindung (über .NET Remoting) an einen Server. Gibt es eine gute Möglichkeit, die Adresse des Clients auf dem Server zu bekommen?

(Ich habe die Frage bearbeitet, ein wenig mehr klar zu sein. Ich bin für alle Art Menschen entschuldigen, die ihr Bestes taten, auf die Frage zu antworten, wenn ich vielleicht etwas zu vage war)

Lösung:
Ich habe einen Weg gefunden, die für mich super funktioniert. Durch die Implementierung eines benutzerdefinierten IServerChannelSinkProvider und IServerChannelSink, wo ich Zugang zu CommonTransportKeys.IPAddress habe, ist es einfach, den Client-IP auf der Callcontext hinzuzufügen.

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, 
    IMessage requestmessage, ITransportHeaders requestHeaders, 
    System.IO.Stream requestStream, out IMessage responseMessage, 
    out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
    try
    {
        // Get the IP address and add it to the call context.
        IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
        CallContext.SetData("ClientIP", ipAddr);
    }
    catch (Exception)
    {
    }

    sinkStack.Push(this, null);
    ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
        requestStream, out responseMessage, out responseHeaders, out responseStream);

    return srvProc;
}

Und dann später (wenn ich eine Anfrage von einem Client erhalten) erhalten nur die IP vom Callcontext wie folgt aus.

public string GetClientIP()
{
    // Get the client IP from the call context.
    object data = CallContext.GetData("ClientIP");

    // If the data is null or not a string, then return an empty string.
    if (data == null || !(data is IPAddress))
        return string.Empty;

    // Return the data as a string.
    return ((IPAddress)data).ToString();
}

Ich kann nun die IP zurück an den Client senden.

War es hilfreich?

Lösung 5

fand ich eine Art und Weise, die für mich super funktioniert. Durch die Implementierung eines benutzerdefinierten IServerChannelSinkProvider und IServerChannelSink, wo ich Zugang zu CommonTransportKeys.IPAddress habe, ist es einfach, den Client-IP auf der Callcontext hinzuzufügen.

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, 
    IMessage requestmessage, ITransportHeaders requestHeaders, 
    System.IO.Stream requestStream, out IMessage responseMessage, 
    out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
    try
    {
        // Get the IP address and add it to the call context.
        IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
        CallContext.SetData("ClientIP", ipAddr);
    }
    catch (Exception)
    {
    }

    sinkStack.Push(this, null);
    ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
        requestStream, out responseMessage, out responseHeaders, out responseStream);

    return srvProc;
}

Und dann später (wenn ich eine Anfrage von einem Client erhalten) erhalten nur die IP vom Callcontext wie folgt aus.

public string GetClientIP()
{
    // Get the client IP from the call context.
    object data = CallContext.GetData("ClientIP");

    // If the data is null or not a string, then return an empty string.
    if (data == null || !(data is IPAddress))
        return string.Empty;

    // Return the data as a string.
    return ((IPAddress)data).ToString();
}

Ich kann nun die IP zurück an den Client senden.

Andere Tipps

Dies ist eine der Fragen, wo man tiefer müssen schauen und vielleicht das ursprüngliche Problem zu überdenken; in diesem Fall „Warum müssen Sie eine externe IP-Adresse?“

Das Problem ist, dass der Computer nicht auf eine externe IP-Adresse hat. Zum Beispiel hat mein Laptop eine interne IP-Adresse (192.168.x.y) vom Router zugewiesen. Der Router selbst hat eine interne IP-Adresse, aber die „externe“ IP-Adresse ist auch interne. Es wird nur verwendet, um mit dem DSL-Modem zu kommunizieren, die tatsächlich die externe, Internet verbundenen IP-Adresse.

Die eigentliche Frage ist: „Wie bekomme ich das Internet verbundene IP-Adresse eines Gerätes 2 Hops entfernt?“ Und die Antwort ist in der Regel, die Sie nicht; zumindest nicht ohne einen Dienst wie whatismyip.com mit, dass Sie bereits entlassen haben, oder einen wirklich massiven Hack beteiligt tun das DSL-Modem Passwort in Ihre Anwendung zu und das DSL-Modem und Screen-Scraping der Admin-Seite (und Gott helfen Ihnen abfragt wenn das Modem immer ersetzt).

EDIT: Nun ist diese in Richtung der Überarbeitete Frage anzuwenden, „Wie kann ich die IP-Adresse meines Client von einem Server .NET-Komponente erhalten?“ Wie whatismyip.com wird die beste der Server in der Lage sein zu tun ist, geben Sie die IP-Adresse Ihres Internet verbundenen Gerät, das die tatsächliche IP-Adresse des Computers mit der Anwendung sein, ist unwahrscheinlich. zurück zu meinem Laptop gehen, wenn mein Internet verbundenen IP 75.75.75.75 und der LAN-IP ist, 192.168.0.112, würde der Server nur in der Lage sein, die IP-Adresse 75.75.75.75 zu sehen. Das wird es so weit wie mein DSL-Modem bekommen. Wenn Ihr Server eine separate Verbindung zu meinem Laptop, ich würde zuerst konfigurieren müssen, das DSL-Modem und alle Router dazwischen sie und meinen Laptop zu erkennen, eingehende Verbindungen von Ihrem Server und Route sie in geeigneter Weise machen wollte. Es gibt ein paar Möglichkeiten, dies zu tun, aber es ist nicht in den Anwendungsbereich dieses Themas.

Wenn Sie sind in der Tat versucht, eine Verbindung aus dem Server machen an den Client zurück, überdenken Sie Ihr Design, weil Sie in WTF Territorium einzutauchen (oder zumindest, Ihre Anwendung zu machen, die viel schwieriger zu implementieren).

Dns.GetHostEntry (Dns.GetHostName ()); wird eine Reihe von IP-Adressen zurück. Die erste sollte die externe IP sein, der Rest diejenigen hinter NAT sein.

So:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());
string externalIP = IPHost.AddressList[0].ToString();

EDIT:

Es gibt Berichte, dass dies nicht für einige Leute nicht funktioniert. Es tut mir, aber vielleicht je nach Netzwerkkonfiguration kann es nicht funktionieren.

besser, nur benutzen http://www.whatismyip.com/automation/n09230945.asp es nur die IP-Ausgänge nur für die automatisierten Lookups
Wenn Sie etwas, das nicht auf jemand Ihre eigene Seite http://www.unkwndesign.com/ip.php ist nur eine kurze Skript:

<?php
echo 'Your Public IP is: ' . $_SERVER['REMOTE_ADDR'];
?>

Der einzige Nachteil hier ist, dass es nur die externe IP der Schnittstelle abrufen, die verwendet wurde, um die Anforderung zu erstellen.

Jonathan Holland Antwort ist grundsätzlich richtig, aber es ist das Hinzufügen wert, dass die API-Aufrufe hinter Dns.GetHostByName ziemlich zeitaufwendig und es ist eine gute Idee, um die Ergebnisse cachen, so dass der Code nur einmal aufgerufen werden muss.

Das Hauptproblem ist die öffentliche IP-Adresse ist nicht unbedingt auf dem lokalen Computer ausgeführt, die Anwendung korreliert. Es wird aus dem internen Netzwerk durch die Firewall übersetzt. Um wirklich die öffentliche IP zu erhalten, ohne das lokale Netzwerk Abfrage ist eine Anforderung an eine Internet-Seite zu machen und das Ergebnis zurück. Wenn Sie nicht über einen öffentlich zugänglichen WhatIsMyIP.com Typ Website verwenden möchten, können Sie einfach erstellen und hosten es sich - vorzugsweise als WebService, so dass Sie eine einfache Seife gefällig Anruf, um es aus Ihrer Anwendung zu machen. Sie würde nicht unbedingt eine Bildschirmaufnahme so viel wie ein Blick hinter den Kulissen posten und die Antwort lesen.

Wenn Sie nur die IP mögen, die an den Adapter gebunden sind, können Sie WMI und die Klasse Win32_NetworkAdapterConfiguration verwenden.

http://msdn.microsoft.com/ en-us / library / aa394217 (VS.85) aspx

Patrik Lösung funktioniert für mich!

habe ich eine wichtige Änderung. In Prozessmeldung habe ich die CallContext mit diesem Code:

// try to set the call context
LogicalCallContext lcc = (LogicalCallContext)requestMessage.Properties["__CallContext"];
if (lcc != null)
{
    lcc.SetData("ClientIP", ipAddr);
}

Dies stellt die IP-Adresse in der richtigen Callcontext, so kann es später mit abgerufen werden GetClientIP().

Nun, vorausgesetzt, Sie haben ein System.Net.Sockets.TcpClient an Ihren Kunden verbunden sind, können Sie (auf dem Server) verwenden client.Client.RemoteEndPoint. Dies gibt Ihnen einen System.Net.EndPoint an den Client zeigt; dass sollte enthält eine Instanz der System.Net.IPEndPoint Unterklasse, obwohl ich über die Bedingungen dafür nicht sicher bin. Nach dem Gießen können Sie überprüfen, es Address Eigenschaft ist die Client-Adresse zu erhalten.

Kurz gesagt, wir haben

using (System.Net.Sockets.TcpClient client = whatever) {
    System.Net.EndPoint ep = client.Client.RemoteEndPoint;
    System.Net.IPEndPoint ip = (System.Net.IPEndPoint)ep;
    DoSomethingWith(ip.Address);
}

Viel Glück.

Ich glaube, theoretisch Sie nicht in der Lage sind, eine Sache zu tun, so, während hinter einem Router zu sein (zum Beispiel ungültige IP-Bereiche verwendet wird), ohne eine externe „Hilfe“ kann.

Sie können im Grunde die Seite, indem Sie eine WebRequest von http://whatismyipaddress.com

zurück analysieren

http://www.dreamincode.net/forums/showtopic24692.htm

Die zuverlässigste Art und Weise, dies zu tun ist, eine Website wie http://checkip.dyndns.org/ oder ähnlich, denn bis Sie tatsächlich extern gehen zu Ihrem Netzwerk, können Sie nicht Ihre externe IP finden. Allerdings hartzucodieren eine solche URL für eventuelle Fehler wird zu fragen. Wir empfehlen Ihnen, nur diese Prüfung durchführen, wenn die aktuelle IP sieht aus wie ein RFC1918 Privatadresse (192.168.x.x die bekannteste von ihnen zu sein.

Gelingt das nicht, können Sie Ihre eigenen, ähnlichen Dienst sitzen außerhalb der Firewall implementieren, so dass Sie zumindest wissen, ob sie defekt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top