通过 C 中的远程处理获取外部 IP 地址

我需要找出计算机a的外部 IP

请先 登录 后评论

6 个回答

FlySwat

Dns.GetHostEntry(Dns.GetHostName());将返回一个 IP 地址数组。第一个应该是外部 IP,其余的是 NAT 后面的。

所以:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());
string externalIP = IPHost.AddressList[0].ToString();

编辑:

有报道称这对某些人不起作用。它对我有用,但可能取决于您的网络配置,它可能不起作用。

请先 登录 后评论
Yes - that Jake.

Jonathan Holland 的回答基本正确,但值得补充的是,Dns.GetHostByName 背后的 API 调用相当耗时,最好缓存结果以便只调用一次代码。

请先 登录 后评论
Eduardo

我相信理论上你在路由器后面(例如使用无效的 IP 范围)不使用外部“帮助”是无法做这样的事情的。

请先 登录 后评论
Nathan Strong

这是您必须深入研究并可能重新考虑原始问题的问题之一;在这种情况下,“为什么需要外部 IP 地址?”

问题是计算机可能没有外部 IP 地址。例如,我的笔记本电脑有一个由路由器分配的内部 IP 地址 (192.168.x.y)。路由器本身有一个内部 IP 地址,但它的“外部”IP 地址也是内部的。它仅用于与 DSL 调制解调器通信,后者实际上具有外部的、面向互联网的 IP 地址。

所以真正的问题变成了,“如何获取 2 跳以外的设备的面向 Internet 的 IP 地址?”答案通常是,你不知道;至少在不使用诸如 whatismyip.com 之类的服务的情况下,您已经解雇了,或者进行了大规模的黑客攻击,涉及将 DSL 调制解调器密码硬编码到您的应用程序中,并查询 DSL 调制解调器和屏幕抓取管理页面(上帝帮助你如果调制解调器被更换)。

编辑:现在将其应用于重构的问题,“如何从服务器 .NET 组件获取客户端的 IP 地址?”与 whatismyip.com 一样,服务器所能做的最好的事情就是为您提供面向 Internet 的设备的 IP 地址,这不太可能是运行该应用程序的计算机的实际 IP 地址。回到我的笔记本电脑,如果我面向 Internet 的 IP 是 75.75.75.75 并且 LAN IP 是 192.168.0.112,那么服务器将只能看到 75.75.75.75 IP 地址。这样就可以达到我的 DSL 调制解调器。如果您的服务器想与我的笔记本电脑建立单独的连接,我首先需要配置 DSL 调制解调器以及它与我的笔记本电脑之间的任何路由器,以识别来自您的服务器的传入连接并适当地路由它们。有几种方法可以做到这一点,但这超出了本主题的范围。

如果您实际上是在尝试建立从服务器到客户端的连接,请重新考虑您的设计,因为您正在深入 WTF 领域(或者至少,使您的应用程序更难部署)。

请先 登录 后评论
Community

主要问题是公共 IP 地址不一定与运行应用程序的本地计算机相关。它是通过防火墙从内部网络翻译过来的。真正不询问本地网络而获得公网IP,就是向一个网页请求并返回结果。如果您不想使用公开可用的 WhatIsMyIP.com 类型的站点,您可以轻松地创建一个并自己托管它 - 最好作为 Web 服务,这样您就可以从应用程序中对其进行简单的肥皂兼容调用。您不一定会像幕后帖子那样进行屏幕截图并阅读响应。

请先 登录 后评论
configurator

好吧,假设您有一个 System.Net.Sockets.TcpClient 连接到您的客户端,您可以(在服务器上)使用 client.Client.RemoteEndPoint。这会给你一个指向客户端的System.Net.EndPoint应该包含 System.Net.IPEndPoint 子类的一个实例,尽管我不确定它的条件。投射到那个之后,你可以检查它的 Address 属性来获取客户端的地址。

简而言之,我们有

using (System.Net.Sockets.TcpClient client = whatever) {
    System.Net.EndPoint ep = client.Client.RemoteEndPoint;
    System.Net.IPEndPoint ip = (System.Net.IPEndPoint)ep;
    DoSomethingWith(ip.Address);
}

祝你好运。

请先 登录 后评论
  • 16 关注
  • 0 收藏,96 浏览
  • Patrik Svensson 提出于 2022-09-27 03:59