隐藏

c#获取外网IP的方法

发布:2022/12/21 17:22:27作者:管理员 来源:本站 浏览次数:590

在网上搜了好几个用来获取外网IP的URL,在应用中也用了,但是过了一段时间发现,其中一个失效了,可能是请求的过多,用的人太多了吧。


今天找了一个来之“站长之家”的:


很简单的一个方法,直接看代码吧:

复制代码


public static string getExternalIp()

       {

           try

           {

               WebClient client = new WebClient();

               client.Encoding = System.Text.Encoding.Default;

               //string response = client.DownloadString("http://1212.ip138.com/ic.asp");//失效了

               //string response = client.DownloadString("http://icanhazip.com/");//可用,可能不稳定

               string response = client.DownloadString("http://ip.chinaz.com/");//站长之家

               string myReg = @"<dd class=""fz24"">([\s\S]+?)<\/dd>";

               Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);

               if (mc.Success && mc.Groups.Count > 1)

               {

                   response = mc.Groups[1].Value;

                   return response;

               }

               else

               {

                   return "Can't get you Ip address!";

               }

           }

           catch(Exception)

           {

               return "Can't get you Ip address!";

           }

             

       }


复制代码


这里需要注意一点的就是里面的正则,不熟悉,查了半天。我们在页面中根据class的名字来正则匹配出来IP地址:


我们看这个网址:http://ip.chinaz.com/


 


 


我们要获取的就是红框中的IP地址:使用正则匹配:

复制代码


string myReg = @"<dd class=""fz24"">([\s\S]+?)<\/dd>";

               Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);

               if (mc.Success && mc.Groups.Count > 1)

               {

                   response = mc.Groups[1].Value;

                   return response;

               }


复制代码


注意:@的作用就是输出“\”这种特殊字符时不需要转义。


\s表示匹配任意空字符,\S表示匹配任意不是空白符的字符。等价于 [^ \f\n\r\t\v]。


  +表示匹配前面的子表达式一次或多次。


  ?表示匹配前面的子表达式零次或一次。


+?一起表示重复1次或更多次,但尽可能少重复。与上面一样,只是至少要重复1次。


          最后才突然发现:站长之家提供查询外网IP的接口:http://ip.chinaz.com/getip.aspx