如何使用TcpClient获取客户端IP地址?

时间:2010-04-26 22:29:27

标签: c# .net tcpclient

我正在使用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?

4 个答案:

答案 0 :(得分:86)

这是否有效:

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

如果客户端通过内部网络连接到您,我不确定您是否可以获取其公共IP,因为返回客户端的连接不需要该信息。

答案 1 :(得分:7)

听起来好像您的服务器使用NAT支持负载均衡器或路由器。在这种情况下,IP数据包将不具有始发客户端的地址,而是NAT路由器的地址。只有NAT路由器知道发送者的地址(在IP级别上)。

根据您可能在TCP上使用的任何更高级别的协议,您可能能够从中获得客户端身份识别,但如果可能是一个问题,则更容易在更高级别欺骗此类信息。< / p>

如果您仅为研究目的而需要此数据,则您的NAT设备可能会保留日志。

如果要求您实时获得真正的原始IP数据包,则可能必须重新配置路由器或将服务器移至DMZ,但这是一个完整的蜡球。和你的网络人员交谈,因为他们肯定会比我更了解这一点(我不是网络专家)。

答案 2 :(得分:2)

只需使用您用来接受客户端的Socket类的连接套接字对象即可。

connectionSocket.RemoteEndPoint.toString();

答案 3 :(得分:-6)

AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString