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

         /// <summary>
/// 获取本机所有ip地址
/// </summary>
/// <param name="netType">"InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址</param>
/// <returns>ip地址集合</returns>
public static List<string> GetLocalIpAddress(string netType)
{
string hostName = Dns.GetHostName(); //获取主机名称
IPAddress[] addresses = Dns.GetHostAddresses(hostName); //解析主机IP地址 List<string> IPList = new List<string>();
if (netType==string.Empty)
{
for (int i = ; i < addresses.Length; i++)
{
IPList.Add(addresses[i].ToString());
}
}
else
{
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
for (int i = ; i < addresses.Length; i++)
{
if (addresses[i].AddressFamily.ToString() == netType)
{
IPList.Add(addresses[i].ToString());
}
}
}
return IPList;
}
     List<string> ips= GetLocalIpAddress("");//获取本地所有ip
List<string> ipv4_ips = GetLocalIpAddress("InterNetwork");//获取ipv4类型的ip
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信息;

         /// <summary>
/// 获取页面html
/// </summary>
/// <param name="url">请求的地址</param>
/// <param name="encoding">编码方式</param>
/// <returns></returns>
public static string HttpGetPageHtml(string url, string encoding)
{
string pageHtml = string.Empty;
try
{
using (WebClient MyWebClient = new WebClient())
{
Encoding encode = Encoding.GetEncoding(encoding);
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");
MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
pageHtml = encode.GetString(pageData);
}
}
catch (Exception e)
{ }
return pageHtml;
}
/// <summary>
/// 从html中通过正则找到ip信息(只支持ipv4地址)
/// </summary>
/// <param name="pageHtml"></param>
/// <returns></returns>
public static string GetIPFromHtml(String pageHtml)
{
//验证ipv4地址
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)))";
string ip = "";
Match m = Regex.Match(pageHtml, reg);
if (m.Success)
{
ip = m.Value;
}
return ip;
}

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

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

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

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

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

  1. openvpn实现内网 映射到 外网

    openvpn实现内网 映射到 外网 场景介绍: 机器介绍 本地一台Ubuntu服务器A , 处于内网中 , 无外网IP 外网一台Ubuntu服务器B , 外网地址139.199.4.205 目标 : ...

  2. VMware下Linux网络配置局域网和外网访问

    要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...

  3. VMware下Linux配置局域网和外网访问(CentOS)

    要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...

  4. iptables 实现centos内网机器访问外网

    环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100内网机器的内网ip ...

  5. MySQL--localhost、局域网、外网访问MySQL

    安装环境: MySQL版本:mysql-installer-community-5.7.22.1.msi,64位 计算机:Windows7旗舰版,64位 本机的局域网IP为:192.168.2.230 ...

  6. 阿里云vpc网络SNAT实现内网实例通外网

    需求场景: 因费用和安全考虑,内网部分机器没有分配公网IP,没绑定弹性公网IP,没有购买NAT服务,但是内网机器需要访问外网部分资源,如发送邮件. 操作步骤如下: 1.查看外网上的转发功能的开启没开启 ...

  7. js获取IP地址多种方法实例教程

    js获取IP地址方法总结   js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...

  8. PHP获取域名、IP地址的方法

    本文介绍下,在php中,获取域名以及域名对应的IP地址的方法,有需要的朋友参考下. 在php中可以使用内置函数gethostbyname获取域名对应的IP地址,比如: 1 <?php 2 ech ...

  9. Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...

随机推荐

  1. JavaScript banner轮播 左右切换 圆点点击切换

    1.效果如下图: 2.源码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  2. SQL Server之替换文本内容中的回车符和换行符

    UPDATE 表 SET 栏位A = REPLACE(栏位A, CHAR(10), '') UPDATE表 SET 栏位A = REPLACE(栏位A, CHAR(13), '')

  3. 不能绑定到端口号:9194原因:Cannot assign requested address: JVM_Bind

    晚上将老服务器程序从win2008部署在新的云服务器win2012上,其实就是复制过去改改配置,启动时突然报不能绑定到端口号:9194原因:Cannot assign requested addres ...

  4. redhat 6.5 更换yum源

    新安装了redhat6.5.安装后,登录系统,使用yum update 更新系统.提示: Loaded plugins: product-id, security, subscription-mana ...

  5. 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了

    看到论坛上各种贴子写用python进行暴力破解的文章,于是自己也想去尝试一下,不试不知道,一试吓一跳,真的就像那句有名的”python由入门到放弃“,把论坛上别人的脚本全部自己敲一遍,运行不报错,但也 ...

  6. 如何下载Twitter视频?最简单的保存推特视频的方法

    Twitter上面的短视频越来越流行了,但是推特官方并没有提供下载通道.如果你想下载这些小视频到电脑或者手机(安卓/iPhone),该如何操作呢?下面介绍一种最简单的方法. 下载Twitter视频我们 ...

  7. LeetCode--回文数(简单)

    题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解 ...

  8. canvas应用

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. pytorch中的nn.CrossEntropyLoss()

    nn.CrossEntropyLoss()这个损失函数和我们普通说的交叉熵还是有些区别 x是模型生成的结果,class是对应的label 具体代码可参见如下 import torch import t ...

  10. [译]Vulkan教程(18)命令buffers

    [译]Vulkan教程(18)命令buffers Command buffers 命令buffer Commands in Vulkan, like drawing operations and me ...