2010-04-26 6 views
23

Ich benutze TcpClient, um auf einen Port für Anfragen zu hören. Wenn die Anfragen vom Client eintreffen, möchte ich wissen, dass der Client ip die Anfrage macht.Wie bekomme ich Client-IP-Adresse mit TcpClient?

Ich habe versucht:

Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString()); 
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString()); 
var networkStream = tcpClient.GetStream(); 
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance); 
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString(); 
Console.WriteLine(socketIp); 

All diese Adressen Ausgabe 10.x.x.x Adressen, die privaten Adressen sind und sind eindeutig nicht die Adresse der die Clients aus meinem Netzwerk die Anfragen. Was kann ich tun, um die Öffentlichkeit der Kunden, die die Anfragen stellen, zu erhalten?

Bearbeiten: Wir verwenden einen Amazon EC2 Load Balancer mit TCP-Weiterleitung. Gibt es eine Möglichkeit, den richtigen Client IP in diesem Setup zu bekommen?

+0

Wie können Sie sicher sein, dass die Adressen "eindeutig" sind und nicht die der Clients in Ihrem Netzwerk? Kennst du zumindest den IP-Bereich, in dem sich deine Kunden aufhalten? Befinden sie sich in Ihrem internen Netzwerk, befinden sie sich im öffentlichen Internet? –

+4

Weil sie alle 10 beginnen. - Dies zeigt einen privaten IP-Bereich an, nicht eine öffentliche IP-Adresse. http://en.wikipedia.org/wiki/Private_network – brendan

Antwort

8

Es klingt vielleicht, dass sich Ihr Server hinter einem Load Balancer oder Router befindet, der NAT verwendet. In diesem Fall hat das IP-Paket nicht die Adresse des ursprünglichen Clients, sondern die Adresse des NAT-Routers. Nur der NAT-Router kennt die Adresse des Absenders (auf IP-Ebene).

Je nachdem, welches Protokoll auf höherer Ebene Sie zusätzlich zu TCP verwenden, können Sie möglicherweise eine Client-ID erhalten, obwohl es viel einfacher ist, solche Informationen auf höheren Ebenen zu fälschen, wenn dies ein Problem darstellt.

Wenn Sie diese Daten nur zu Forschungszwecken benötigen, kann Ihr NAT-Gerät ein Protokoll führen.

Wenn es eine Voraussetzung ist, dass Sie das echte Ursprungs-IP-Paket in Echtzeit erhalten, müssen Sie möglicherweise Ihren Router neu konfigurieren oder Ihren Server in die DMZ verschieben, aber das ist ein ganz anderer Ball aus Wachs. Sprechen Sie mit Ihrem Netzwerk, da sie sicher mehr darüber wissen würden als ich (ich bin kein Netzwerkexperte).

+0

Wir verwenden einen Amazon EC2 Load Balancer mit TCP-Weiterleitung - irgendwelche Ideen, wie ich das bekommen kann, um mir den anfordernden Client IP zu geben? – brendan

+0

Sie müssen sich mit Amazon in Verbindung setzen. Es könnte ein Zusatzpaket für eine zusätzliche Gebühr sein. –

68

Hat diese Arbeit:

((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString() 

Wenn der Client über ein internes Netzwerk zu Ihnen verbindet Ich bin nicht sicher, dass Sie ihre öffentliche IP, da die Verbindung bekommen können zurück an den Client diese Informationen nicht benötigen würde zu bekommen .

+0

arbeitete für mich, danke! – DrNachtschatten

-6
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString 
+3

Ist das nicht das gleiche wie @Kelsey Antwort, nur in 'vb'? –

+1

Sie sollten Ihrer Antwort eine Erklärung hinzufügen. Wenn Sie nur Code zur Verfügung stellen (insbesondere für komplexere Antworten), wissen die Benutzer möglicherweise nicht, wie sie es verwenden sollen. – starbeamrainbowlabs