2010-04-26 7 views
23

Sto usando TcpClient per ascoltare su una porta per richieste. Quando le richieste arrivano dal cliente, voglio sapere che il client ip sta facendo la richiesta.Come posso ottenere l'indirizzo IP del client usando TcpClient?

ho provato:

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

Tutti questi indirizzi 10.x.x.x uscita indirizzi che sono indirizzi privati ​​e non sono chiaramente l'indirizzo del i clienti dalla mia rete fare le richieste. Cosa posso fare per ottenere l'IP pubblico dei client che effettuano le richieste?

Modifica: Stiamo utilizzando un bilanciamento del carico Amazon EC2 con l'inoltro TCP. C'è un modo per ottenere il vero client IP in questa configurazione?

+0

come si può essere sicuri che gli indirizzi siano "chiaramente" non quelli dei client fuori dalla rete. Conosci almeno la gamma IP in cui risiedono i tuoi clienti? Risiedono nella rete interna, risiedono nella rete pubblica? –

+4

Perché iniziano tutti 10. - Ciò indica che un intervallo IP privato non è un indirizzo IP pubblico. http://en.wikipedia.org/wiki/Private_network – brendan

risposta

8

Sembra che il server si trovi dietro un bilanciamento del carico o un router che utilizza NAT. In questo caso, il pacchetto IP non avrà l'indirizzo del client di origine, ma l'indirizzo del router NAT. Solo il router NAT conosce l'indirizzo del mittente (a livello IP).

A seconda del protocollo di livello superiore che potrebbe essere utilizzato su TCP, è possibile ottenere l'identificazione del client da questo, anche se è molto più facile falsificare tali informazioni a livelli più elevati, se ciò può costituire un problema.

Se sono necessari questi dati solo per scopi di ricerca, il dispositivo NAT può conservare un registro.

Se è un requisito che si ottiene il vero pacchetto IP di origine in tempo reale, potrebbe essere necessario riconfigurare il router o spostare il server nella DMZ, ma questa è tutta una cerata di cera. Parla con i tuoi colleghi di rete, poiché sicuramente ne saprebbero di più di me (non sono un esperto di reti).

+0

Stiamo utilizzando un bilanciamento del carico Amazon EC2 con l'inoltro tcp - qualche idea su come posso ottenere questo per darmi l'IP del client richiedente? – brendan

+0

Dovrai metterti in contatto con Amazon su questo. Potrebbe essere un pacchetto aggiuntivo a pagamento. –

68

fa questo lavoro:

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

Se il client si connette a voi tramite una rete interna non sono sicuro che si può ottenere il loro IP pubblico in quanto il collegamento per tornare al client non avrebbe bisogno che le informazioni .

+0

ha funzionato per me, grazie! – DrNachtschatten

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

Non è lo stesso della risposta @Kelsey, solo in 'vb'? –

+1

È necessario aggiungere una spiegazione alla risposta. Se fornisci semplicemente il codice (soprattutto per le risposte più complesse), le persone potrebbero non sapere come usarlo. – starbeamrainbowlabs