目录
- 获取局域网ip
- 获取客户端ip
网络上的答案获取的ip是服务器的ip或者获取本地ip,然后通过ip获取详细地址,要么报错,要么或者客户端的位置不正确…直接给我整麻了~
网络答案:
获取局域网ip
func GetOutBoundIP() (ip string, err error) { conn, err := net.Dial("udp", "8.8.8.8:53") if err != nil { fmt.Println(err) return } localAddr := conn.LocalAddr().(*net.UDPAddr) ip = strings.Split(localAddr.String(), ":")[0] return }
获取外网能访问的动态ip,获取的是本机的ip不是客户端的ip
func GetOutBoundIP(ctx iris.Context) (ip string, err error) { resp, err := http.Get("http://myexternalip.com/raw") if err != nil { return "",err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) ip = string(body) return }
后来发现以上都不适合或者客户端ip
获取客户端ip
//通过iris的context内部函数获取请求头部获取ip func GetOutBoundIP(ctx iris.Context) (string, error) { //从请求头部的X-REAL-IP获取Ip ip := ctx.Request().Header.Get("X-REAL-IP") netIP := net.ParseIP(ip) if netIP != nil { return ip, nil } //从请求头部的X-FORWARDED-FOR获取Ip ips := ctx.Request().Header.Get("X-FORWARDED-FOR") splitIps := strings.Split(ips, ",") for _, ip := range splitIps { netIP := net.ParseIP(ip) if netIP != nil { return ip, nil } } //从请求头部的RemoteAddr获取Ip ip, _, err := net.SplitHostPort(ctx.Request().RemoteAddr) if err != nil { return "", err } netIP = net.ParseIP(ip) if netIP != nil { return ip, nil } return "", fmt.Errorf("正确ip获取失败") }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)