我正在运行服务器,我想显示自己的IP地址 .
获取计算机自身(如果可能的话,外部)IP地址的语法是什么?
有人写了下面的代码 .
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
但是,我一般不信任作者,我不理解这段代码 . 有没有更好的方法呢?
25 回答
了解您的公共知识产权的唯一方法是请别人告诉您;此代码可以帮助您:
清洁和一体化解决方案:D
这是为了在VB.NET中以csv格式获取所有本地IP
不,这几乎是最好的方法 . 由于一台机器可能有多个IP地址,您需要迭代它们的集合以找到合适的IP地址 .
Edit: 我唯一要改变的就是改变这个:
对此:
没有必要
ToString
枚举用于比较 .如果你不能依赖从DNS服务器获取你的IP地址(这发生在我身上),你可以使用以下方法:
System.Net.NetworkInformation命名空间包含NetworkInterface class,其具有静态GetAllNetworkInterfaces method .
此方法将返回您计算机上的所有“网络接口”,即使您的计算机上只安装了无线适配器和/或以太网适配器硬件,也通常会有很多“网络接口” . 所有这些网络接口都具有本地计算机的有效IP地址,尽管您可能只需要一个 .
如果您正在寻找一个IP地址,那么您需要过滤下来的列表,直到您找到正确的地址 . 您可能需要做一些实验,但我使用以下方法取得了成功:
OperationalStatus == OperationalStatus.Up
过滤掉所有处于非活动状态的NetworkInterface . 例如,如果您没有插入网络电缆,这将排除您的物理以太网适配器 .对于每个NetworkInterface,您可以使用GetIPProperties method获取IPInterfaceProperties对象,并且可以从IPInterfaceProperties对象访问UnicastAddresses property以获取UnicastIPAddressInformation对象的列表 .
通过检查
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
过滤掉非首选单播地址通过检查
AddressPreferredLifetime != UInt32.MaxValue
过滤掉"virtual"地址 .此时,我获取与所有这些过滤器匹配的第一个(如果有)单播地址的地址 .
编辑:
[修订后的代码于2018年5月16日,包括上述文本中提到的重复地址检测状态和首选寿命]
下面的示例演示了基于操作状态,地址族的过滤,不包括环回地址(127.0.0.1),重复地址检测状态和首选生命周期 .
刚刚在我的机器上测试了它,它的工作原理 .
如果您想避免使用DNS:
不要一直依赖InterNetwork,因为你可以拥有多个同时使用IP4的设备,这会破坏获取IP的结果 . 现在,如果您愿意,可以复制一下,请查看或更新为您认为合适的方式 .
首先,我得到路由器的地址(网关)如果它返回我连接到网关(这意味着没有直接连接到调制解调器无线),那么我们的网关地址为IPAddress,否则我们是空指针IPAddress参考 .
然后我们需要获取计算机的IP地址列表 . 事情并不困难,因为路由器(所有路由器)使用4个字节(...) . 前三个是最重要的,因为连接到它的任何计算机将具有与前三个字节匹配的IP4地址 . 例如:192.168.0.1是路由器默认IP的标准,除非由管理员更改 . '192.168.0'或者它们可能是我们需要匹配的东西 . 这就是我在IsAddressOfGateway函数中所做的一切 . 长度匹配的原因是因为并非所有地址(仅用于计算机)都具有4个字节的长度 . 如果在cmd中键入netstat,您会发现这是真的 . 所以你有它 . 是的,真正得到你想要的东西需要更多的工作 . 排除法 . 并且为了上帝的缘故,不要通过ping它来找到地址,这需要时间,因为首先你要发送要被ping的地址然后它必须发回结果 . 不,直接使用.Net类来处理您的系统环境,当您必须单独使用计算机时,您将获得所需的答案 .
现在,如果你直接连接到你的调制解调器,过程几乎是相同的,因为调制解调器是你的网关,但子掩码不一样,因为你通过调制解调器直接从你的DNS服务器获取信息,而不是由提供调制解调器的路由器屏蔽互联网给你,虽然你仍然可以使用相同的代码,因为分配给调制解调器的IP的最后一个字节是1.因此,如果从发生变化的调制解调器发送的IP是111.111.111.1'那么你将获得111.111.111 . (一些字节值) . 请记住,我们需要找到网关信息,因为有更多的设备处理互联网连接而不是路由器和调制解调器 .
现在你明白为什么你不要改变你的路由器前两个字节192和168.这些只是严格区分路由器而不是互联网使用,否则我们会遇到严重的IP协议和双重ping问题导致计算机崩溃 . 您分配的路由器IP为192.168.44.103的图像,并且您也单击具有该IP的站点 . 我的天啊!您的计算机不知道要ping什么 . 崩溃就在那里 . 为避免此问题,仅为路由器分配这些,而不是用于Internet使用 . 所以留下路由器的前两个字节 .
我只是想我会添加自己的,单行(即使已经有许多其他有用的答案) .
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
要获取当前的公共IP地址,您需要做的就是在页面加载事件上创建一个带有以下行的ASPX页面:
如果您在Intranet中运行,您将能够获得本地计算机IP地址,如果没有,您将获得外部IP地址:Web:
桌面:
请查看here了解详情 .
你必须记住你的计算机可以有多个IP(实际上它总是这样) - 所以你要去哪一个 .
试试这个:
也许通过 external IP你可以考虑(如果你在Web服务器上下文中)使用它
我问的是和你一样的问题,我在this stackoverflow文章中找到了它 .
它对我有用 .
返回第一个内部IPV4地址的简单单行代码,如果没有则返回null . 作为上面的评论添加,但可能对某人有用(上面的一些解决方案将返回需要进一步过滤的多个地址) .
它也很容易返回loopback而不是null我猜:
为了找到IP地址列表,我使用了这个解决方案
但我个人喜欢以下解决方案来获取本地有效的IP地址
LINQ解决方案:
这是我如何解决它 . 我知道如果你有几个物理接口,这可能不会选择你想要的确切的eth .
问题并不是说ASP.NET MVC,但我还是把它留在这里:
使用LINQ将所有IP地址作为字符串获取:
TO FILTER OUT PRIVATE ONES...
首先,定义一个扩展方法
IsPrivate()
:...然后用它来过滤私有IP:
它适用于我...并且在大多数情况下(如果不是全部)应该比查询DNS服务器更快 . 感谢Wily博士的学徒(here) .
就像参考一样,这是我定义它的完整类代码:
以最快的方式获取远程IP地址 . 您必须使用下载程序,或在计算机上创建服务器 .
使用这个简单代码的缺点:(推荐使用)是获取远程IP地址需要3-5秒,因为初始化时WebClient总是需要3-5秒来检查您的代理设置 .
以下是我修复它的方法..(第一次仍然需要3-5秒),但之后它将始终在0-2秒内获取您的远程IP地址,具体取决于您的连接 .