2010-04-26 412 views
23

我正在使用TcpClient在端口上偵聽請求。當請求從客戶端進入時,我想知道發出請求的客戶端IP。如何使用TcpClient獲取客戶端IP地址?

我已經試過:

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

所有這一切都是私有地址,顯然不是的客戶端的地址把我的網絡發出請求這些地址輸出10.x.x.x地址。我能做些什麼來獲得提出請求的客戶的公共IP?

編輯: 我們正在使用帶有tcp轉發的Amazon EC2負載均衡器。有沒有辦法在這個設置中獲得真正的客戶端IP?

+0

你怎麼能確定地址是「明確」不是你的網絡客戶端的地址。你至少知道你的客戶所在的IP範圍?他們是否居住在您的內部網絡中,他們是否居住在公共互聯網? – 2010-04-27 03:58:58

+4

因爲它們都從10開始。 - 這表示私有IP範圍不是公共IP地址。 http://en.wikipedia.org/wiki/Private_network – brendan 2010-04-27 04:21:24

回答

8

聽起來好像您的服務器位於使用NAT的負載均衡器或路由器後面。在這種情況下,IP數據包將不具有始發客戶端的地址,而是NAT路由器的地址。只有NAT路由器知道發件人的地址(在IP級別上)。

根據您可能在TCP上使用的更高級別的協議,您可能能夠從中獲得客戶端標識,但如果這可能是一個問題,在較高級別上欺騙此類信息要容易得多。

如果您僅將此數據用於研究目的,則您的NAT設備可能會保留日誌。

如果需要實時獲得真正的始發IP數據包,則可能必須重新配置路由器或將服務器移動到DMZ,但這是一個完整的蠟球。與您的網絡人員交談,因爲他們肯定比我更瞭解這一點(我不是網絡專家)。

+0

我們正在使用一個帶有tcp轉發的亞馬遜EC2負載均衡器 - 關於如何讓我可以提供請求客戶端IP的任何想法? – brendan 2010-04-27 14:03:29

+0

你必須與亞馬遜保持聯繫。它可能是一個額外的費用附加套餐。 – 2010-04-27 21:04:44

68

這是否工作:

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

如果客戶端通過內部網絡連接到你我不知道,你可以得到他們的公網IP,因爲連接要回,客戶端將不再需要這些信息。

+0

爲我工作,謝謝! – DrNachtschatten 2017-05-15 06:45:08

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

與@凱爾西答案不一樣,只是'vb'? – 2014-10-10 22:58:37

+1

你應該給你的答案添加一個解釋。如果你只是提供代碼(特別是對於更復雜的答案),人們可能不知道如何使用它。 – starbeamrainbowlabs 2016-06-25 12:15:46

相關問題