我有一个非常简单的http服务器:
TcpListener server = new TcpListener(System.Net.IPAddress.Any, 80);
server.Start();
var client = server.AcceptTcpClient();
var ip = client.Client.RemoteEndPoint;
// ip address in here is: 166.72.162.85
// etc. read request and write response....
我正在使用连接到AT& T 3G网络的手机发出请求。我的服务器检测到IP地址 166.72.162.85
现在这是我的问题。我问这个问题是主要的问题。为什么谷歌会捕获不同的IP地址? 如何使用我的TcpListener捕获2600:387:9:3 :: c7?
答案 0 :(得分:9)
看起来你是双堆叠网络 - 你有IPv4和IPv6连接,有点像同时连接到两个独立的“互联网”。
您的服务器可能只能通过其中一个“互联网” - IPv4 Internet访问。谷歌可以从两者访问。我们可以通过将www.google.com
解析为IP地址来轻松检查。这是我机器上的结果:
请注意第一个结果 - 2a00:1450:4001:821::2004
。这是一个IPv6地址,这是您的操作系统在访问www.google.com
时尝试连接的第一个地址,因为现代操作系统更喜欢IPv6 over IPv4。因此,您与Google的关联将通过IPv6进行,这将使您看到来自您的IPv6地址(2600:387:9:3::c7
)。
连接到仅限IPv4的服务器时,将通过IPv4进行连接 - 从您的IPv4地址166.72.162.85
到服务器的IPv4地址。
要使用IPv6访问您的服务器,您需要通过IPv6访问它:
System.Net.IPAddress.Any
,which is equivalent to 0.0.0.0,意思是“任何IPv4地址”。相反,您需要绑定到IPAddress.IPv6Any,这相当于0:0:0:0:0:0:0:0
(或::
),意思是“任何IPv6地址”。顺便说一句,您可以尝试从https://ipv4.google.com/
的仅限IPv4的Google获取IP。它应该返回您在服务器中看到的相同166.72.162.85
。
答案 1 :(得分:1)
Google正在显示IPv6地址,您的代码显示的是IPv4。
请注意,您还可以在接收端看到不同的IP,具体取决于流量到达的路由,例如,如果涉及代理,您将看到代理的IP而不是源的实际IP。