C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
程序员文章站
2023-11-14 17:10:52
本文实例讲述了c#实现获取本地内网(局域网)和外网(公网)ip地址的方法。分享给大家供大家参考,具体如下:1、获取本机的ip地址集合:/// /// 获取本机所有ip...
本文实例讲述了c#实现获取本地内网(局域网)和外网(公网)ip地址的方法。分享给大家供大家参考,具体如下:
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 = 0; i < addresses.length; i++) { iplist.add(addresses[i].tostring()); } } else { //addressfamily.internetwork表示此ip为ipv4, //addressfamily.internetworkv6表示此地址为ipv6类型 for (int i = 0; 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接口,比如:
ps:这里再为大家推荐几款ip相关工具供大家参考使用:
ip地址归属地在线查询工具:
在线ip地址/子网掩码计算与转换工具:
在线网络计算器|tcp/ip子网掩码计算与换算工具: