zoukankan      html  css  js  c++  java
  • go 内网IP及*IP获取

    流传的go版本内网获取都不准确,所以想到之前看到的python版本,通过拟一个UDP连接来获取

    package main
    
    import (
    	"errors"
    	"fmt"
    	"io"
    	"net"
    	"net/http"
    	"strings"
    )
    
    func main() {
    	fmt.Println(GetExternalIP())
    	fmt.Println(GetInternalIP())
    }
    
    func GetInternalIP() (string, error) {
    	// 思路来自于Python版本的内网IP获取,其他版本不准确
    	conn, err := net.Dial("udp", "8.8.8.8:80")
    	if err != nil {
    		return "", errors.New("internal IP fetch failed, detail:" + err.Error())
    	}
    	defer conn.Close()
    
    	// udp 面向无连接,所以这些东西只在你本地捣鼓
    	res := conn.LocalAddr().String()
    	res = strings.Split(res, ":")[0]
    	return res, nil
    }
    
    func GetExternalIP() (string, error) {
    	// 有很多类似网站提供这种服务,这是我知道且正在用的
    	// 备用:https://myexternalip.com/raw (cip.cc 应该是够快了,我连手机热点的时候不太稳,其他自己查)
    	response, err := http.Get("http://ip.cip.cc")
    	if err != nil {
    		return "", errors.New("external IP fetch failed, detail:" + err.Error())
    	}
    
    	defer response.Body.Close()
    	res := ""
    
    	// 类似的API应当返回一个纯净的IP地址
    	for {
    		tmp := make([]byte, 32)
    		n, err := response.Body.Read(tmp)
    		if err != nil {
    			if err != io.EOF {
    				return "", errors.New("external IP fetch failed, detail:" + err.Error())
    			}
    			res += string(tmp[:n])
    			break
    		}
    		res += string(tmp[:n])
    	}
    
    	return strings.TrimSpace(res), nil
    }
    

      

  • 相关阅读:
    nuxtjs项目安装依赖报错
    汇总资源
    nuxt.js
    关于Git每次进入都需要输入用户名和密码的问题解决
    Chrome
    44.树与树算法
    43.搜索
    41.栈
    42.排序
    39.协程
  • 原文地址:https://www.cnblogs.com/ligaofeng/p/13633624.html
Copyright © 2011-2022 走看看