手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜Qcloud , 注册 | 登陆

go获取当前的公网IP

首页 > Go >

 获取公网IP的方法其实很简单,最简单的就是利用dnspod的服务,echo `nc ns1.dnspod.net 6666`,立刻就出来了。于是hugozhu的一段代码就是这样写的:

XML/HTML代码
  1. func GetLocalPublicIpUseDnspod() (string, error) {  
  2.     timeout :time.Nanosecond * 30  
  3.     conn, err :net.DialTimeout("tcp", "ns1.dnspod.net:6666", timeout*time.Second)  
  4.     defer func() {  
  5.         if x :recover(); x != nil {  
  6.             log.Println("Can't get public ip", x)  
  7.         }  
  8.         if conn != nil {  
  9.             conn.Close()  
  10.         }  
  11.     }()  
  12.     if err == nil {  
  13.         var bytes []byte  
  14.         deadline :time.Now().Add(timeout * time.Second)  
  15.         err = conn.SetDeadline(deadline)  
  16.         if err != nil {  
  17.             return "", err  
  18.         }  
  19.         bytes, err = ioutil.ReadAll(conn)  
  20.         if err == nil {  
  21.             return string(bytes), nil  
  22.         }  
  23.     }  
  24.     return "", err  
  25. }  

上面的原始代码在:http://hugozhu.myalert.info/2013/02/26/dynamic-dns-script.html,原文的代码中其实是不能运行的。因为:timeout是个未定义的变量。

OK,不说这个。我在现实中不能使用上面的代码,因为nc ns1.dnspod.net取出来的结果不正确。为什么?因为我用的是铁通,好象会经过一层代理。但是我访问ip138又是可以取到真实的公网IP,所以我使用了如下代码 :

XML/HTML代码
  1. func GetLocalPublicIp() (string, error) {  
  2.     // `nc ns1.dnspod.cn 6666`  
  3.     res, err :http.Get("http://iframe.ip138.com/ic.asp")  
  4.     if err != nil {  
  5.         return "", err  
  6.     }  
  7.     defer res.Body.Close()  
  8.     result, err :ioutil.ReadAll(res.Body)  
  9.     if err != nil {  
  10.         return "", err  
  11.     }  
  12.     reg :regexp.MustCompile(`\d+\.\d+\.\d+\.\d+`)  
  13.     return reg.FindString(string(result)), nil  
  14. }  

上面我用的正则十分简单。就这样写写算了。因为这个页面里就这么一个符合的地方。OK,现在就一切正常了




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):