【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法

1、获取本机的IP地址集合:

 1         /// <summary>
 2         /// 获取本机所有ip地址
 3         /// </summary>
 4         /// <param name="netType">"InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址</param>
 5         /// <returns>ip地址集合</returns>
 6         public static List<string> GetLocalIpAddress(string netType)
 7         {
 8             string hostName = Dns.GetHostName();                    //获取主机名称
 9             IPAddress[] addresses = Dns.GetHostAddresses(hostName); //解析主机IP地址
10
11             List<string> IPList = new List<string>();
12             if (netType==string.Empty)
13             {
14                 for (int i = 0; i < addresses.Length; i++)
15                 {
16                     IPList.Add(addresses[i].ToString());
17                 }
18             }
19             else
20             {
21                 //AddressFamily.InterNetwork表示此IP为IPv4,
22                 //AddressFamily.InterNetworkV6表示此地址为IPv6类型
23                 for (int i = 0; i < addresses.Length; i++)
24                 {
25                     if (addresses[i].AddressFamily.ToString() == netType)
26                     {
27                         IPList.Add(addresses[i].ToString());
28                     }
29                 }
30             }
31             return IPList;
32         }
1     List<string> ips= GetLocalIpAddress("");//获取本地所有ip
2     List<string> ipv4_ips = GetLocalIpAddress("InterNetwork");//获取ipv4类型的ip
3     List<string> ipv6_ips = GetLocalIpAddress("InterNetworkV6");//获取ipv6类型的ip

2、获取本机局域网内IP地址:

  如果本机在局域网内,直接调用上面的方法即可,以ipv4为例:

List<string> ipv4_ips = GetLocalIpAddress("InterNetwork");

  如果本机只有一个网卡,且没有安装虚拟网卡,那么ipv4_ips里应该只有一条数据,即局域网内地址;

3、获取本机的公网IP地址:

1)、如果本机是拨号上网的或具有独立公网IP的情况下,使用上面的方法即可,以ipv4为例:

List<string> ipv4_ips = GetLocalIpAddress("InterNetwork");

  如果本机只有一个网卡,且没有安装虚拟网卡,那么ipv4_ips里应该只有一条数据,即公网IP地址;

2)、如果是路由上网的,想获取网关的外网IP,只能通过访问一些公网的地址来获取外网IP了;

  步骤:先获取到含有本机外网ip的页面信息,再通过正则获取到ip信息;

 1         /// <summary>
 2         /// 获取页面html
 3         /// </summary>
 4         /// <param name="url">请求的地址</param>
 5         /// <param name="encoding">编码方式</param>
 6         /// <returns></returns>
 7         public static string HttpGetPageHtml(string url, string encoding)
 8         {
 9             string pageHtml = string.Empty;
10             try
11             {
12                 using (WebClient MyWebClient = new WebClient())
13                 {
14                     Encoding encode = Encoding.GetEncoding(encoding);
15                     MyWebClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36");
16                     MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
17                     Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
18                     pageHtml = encode.GetString(pageData);
19                 }
20             }
21             catch (Exception e)
22             {
23
24             }
25             return pageHtml;
26         }
27         /// <summary>
28         /// 从html中通过正则找到ip信息(只支持ipv4地址)
29         /// </summary>
30         /// <param name="pageHtml"></param>
31         /// <returns></returns>
32         public static string GetIPFromHtml(String pageHtml)
33         {
34             //验证ipv4地址
35             string reg = @"(?:(?:(25[0-5])|(2[0-4]\d)|((1\d{2})|([1-9]?\d)))\.){3}(?:(25[0-5])|(2[0-4]\d)|((1\d{2})|([1-9]?\d)))";
36             string ip = "";
37             Match m = Regex.Match(pageHtml, reg);
38             if (m.Success)
39             {
40                 ip = m.Value;
41             }
42             return ip;
43         }

  测试(测试时间:2019年6月18日17:37:46):

1     var t0_html = HttpGetPageHtml("https://www.ip.cn", "utf-8");
2     var t1_html = HttpGetPageHtml("http://www.ip138.com/ips138.asp", "gbk");
3     var t2_html = HttpGetPageHtml("http://www.net.cn/static/customercare/yourip.asp", "gbk");
4     var t0_ip = GetIPFromHtml(t0_html);// 111.198.29.123
5     var t1_ip = GetIPFromHtml(t1_html);// 111.198.29.123
6     var t2_ip = GetIPFromHtml(t2_html);// 111.198.29.123

  目前这几个url地址都可以用,但不保证长久稳定,如果想稳定可靠的使用,可以使用一些收费的API接口,比如:http://user.ip138.com/ip/   

————————————————————————————————————————

原文地址:https://www.cnblogs.com/willingtolove/p/11046564.html

时间: 2024-12-20 13:59:18

【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法的相关文章

获取本地公网IP地址的方法

适用场景: 服务器地址为net映射地址,本机ifconfig无法直接获取映射的公网地址. 方法1: [[email protected]1 nidongde]# curl http://ifconfig.me 50.1xx.2xx.18 ifconfig.me的地址为日本地址,访问可能比较慢. 方法2: [[email protected]1 nidongde]# curl http://www.net.cn/static/customercare/yourip.asp 2>/dev/null|

关于网络中的内网IP地址和公网IP地址

公网IP和内网IP    一.先来看一下IP地址划分: A类地址:0.0.0.0------127.255.255.255 其中127.255.255.255是广播地址,不能分配 B类地址:128.0.0.0------191.255.255.255 C类地址:192.0.0.0------223.255.255.255 D类地址:224.0.0.0-----239.255.255.255 E类地址:240.0.0.0------255.255.255         你要是想看你自己机子的IP

如何简单使用ngrok,将网站内网映射到外网

由于最近实验室的需要,需要对每个网站制作demo版本进行展示(区分于正式版本),就准备使用ngrok进行内网映射到外网. Google一番后发现国外的ngrok.com没办法访问,苦苦寻找后发现了一个国内的站点:http://www.ngrok.cc/ 直接下载win 64位版本的. 下载解压后,文件夹中包含了ngrok.exe和ngrok.cfg两个文件 同时保证本地的服务器已经启动.如图本地我开启了tomcat服务器 18080端口. 这时我们通过cmd 到达下载好的ngrok目录.(如果直

〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网

环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP Link WR740R 达成目标: 宿舍成员通过路由器2正常访问校园外网,同时,可以正常访问校园内网. 操作步骤: 一.配置路由器1(校园内网) 1. 修改路由器地址从192.168.1.1到192.168.1.2: 登录192.168.1.1 -- 网络配置 -- LAN -- IP地址 -- 输

把内网映射到外网的步骤教程

内网映射到外网的工具 ngrok可以将内网映射到公网,这样就可以访问本地的网络服务 用法: 打开自己电脑的cmd 一.ngrok 8080 本地Tomcat的端口号. 二.输入ngrok -config ngrok.cfg -subdomain example 8080(国内域名)(example  可以根据自己的变)[国内] 可以参考帮助文档 : http://www.tunnel.moi/ ngrok.cfg 官网文档上下载 放到 ngrok里面

linux内网机器访问外网代理设置

1.检查机器 在操作中发现访问外网的机器本身不能使用yum 安装软件,故需要配置yum安装源.如果可以的,这步可忽略. [[email protected] test]# lsb_release -a LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.

用PAT技术实现不同网段内网PC访问外网服务器

写在最前边: ????????? PAT技术翻译成中文叫做地址复用技术,是基于NAT技术的一种衍生版,目的就是实现局域网中的多个私网IP对一个或者多个公网IP的复用,从而节省公网IP.我在刚开始学习PAT配置的时候,受一些教学视频的先入为主,认为在路由器上面配置好PAT后就可以实现外网地址访问内网私有地址,实际上这种思想是错误的. ????????? ???????? 我们熟知的私网地址有三类,A,B,C类地址分别留了一个地址段作为私网地址段,而这些私网地址是不允许出现在公网上面的,所以说互联网

判断访问者是内网访问还是外网访问

//域登录  判断是内网还是外网请求 public function regip($ip){ $ip = ip2long($ip); $net_a = ip2long('10.255.255.255') >> 24; //A类网预留ip的网络地址 $net_b = ip2long('172.31.255.255') >> 20; //B类网预留ip的网络地址 $net_c = ip2long('192.168.255.255') >> 16; //C类网预留ip的网络地

内网服务器无外网上网 &&端口映射

一内网上网 环境说明: 主机A: 1.宿主上网机器 eth0:10.0.0.8   #作为外网地址 eth1:172.16.1.8   #内网地址 外网网卡信息: [[email protected] ~]# cat  /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPADDR=10.0.0.8 NETMASK=255.