获取本机外网IP相关

今天检测本机IP的时候,本来是只需要检测出来内网IP的,突然对获取外网IP的方法有了些兴趣,就去网上搜了一下。

网上的方法倒是挺一致,连接可以查询IP的网站,然后返回这个网页的信息,用正则表达式检索出来,虽然相当于没有在本地实现,但是只要能获取到,结果都是一样的,我就代码加上试了一下,但是,调用GetResponse()返回:远程服务器返回错误: (403) 已禁止,这算是怎么回事?大神们的代码都不调试的吗?写完都不看结果的吗?

代码如下,大家可以试试:

string str = GetPage("http://www.123cha.com");

static string GetPage(string url)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            try
            {
                using(HttpWebResponse res = (HttpWebResponse)req.GetResponse())
                {

                    using (StreamReader sr = new StreamReader(res.GetResponseStream()))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            catch (System.Exception e)
            {
                return e.Message;
            }
            finally
            {
                req.Abort();
            }
        }

网上找了好久,试了一下,给http标头赋值,问题解决了,UserAgent默认的值是null,应该是这个网站的问题,使用默认值,我连接百度和谷歌是没有问题的。对于UserAgent的赋值标准不太了解,但是测试的结果是不能为null和空字符串,随便赋值都可以。

req.UserAgent = "hello web";添加之后没问题了。

 

然后再说下一个问题,关于正则表达式的匹配,在获取到的界面中查询IP的时候,@"IP: \[(?<IP>[0-9\.]*)\]",我不知道为什么要这么检索,理论上我需要查询的只是IP地址,具体这个地址前面加不加IP:之类的东西我完全不需要关心,而且,这个检测IP的也不对,IP地址的规则是不可能0-9都行的。

完整代码如下,测试通过:

string patt = @"((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[1-9])";
string url = "http://www.123cha.com";
string str = Regex.Match(GetPage(url), patt).Value;

        static string GetPage(string url)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            try
            {
                req.UserAgent = "hello web";
                using(HttpWebResponse res = (HttpWebResponse)req.GetResponse())
                {

                    using (StreamReader sr = new StreamReader(res.GetResponseStream()))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            catch (System.Exception e)
            {
                return e.Message;
            }
            finally
            {
                req.Abort();
            }
        }

本来挺简单的一个功能,查问题查了一个晚上,大家写出来的东西,还是最好能保证测试通过吧,稳定性,健壮性,异常什么的不说,但是总不能一次都成功不了吧。http头的规范我还是有些疑惑,以后再看吧。

posted @ 2013-11-09 02:07  _倔强  阅读(865)  评论(0编辑  收藏  举报