golang获取客户端ip的实现

 更新时间:2023年07月04日 10:41:41   作者:沉默小管  
本文主要介绍了golang获取客户端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获取失败")
}

到此这篇关于golang获取客户端ip的实现的文章就介绍到这了,更多相关golang获取客户端ip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Golang实现统一加载资源的入口

    基于Golang实现统一加载资源的入口

    当我们需要在 main 函数中做一些初始化的工作,比如初始化日志,初始化配置文件,都需要统一初始化入口函数,所以本文就来编写一个统一加载资源的入口吧
    2023-05-05
  • Go语言滑动窗口最大值的实现示例

    Go语言滑动窗口最大值的实现示例

    本文主要介绍了Go语言滑动窗口最大值的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • 一文带你了解Go语言如何解析JSON

    一文带你了解Go语言如何解析JSON

    本文将说明如何利用 Go 语言将 JSON 解析为结构体和数组,如果解析 JSON 的嵌入对象,如何将 JSON 的自定义属性名称映射到结构体,如何解析非结构化的 JSON 字符串
    2023-01-01
  • 浅谈golang 的高效编码细节

    浅谈golang 的高效编码细节

    本文主要介绍了golang 的高效编码细节,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 一文带你掌握掌握 Golang结构体与方法

    一文带你掌握掌握 Golang结构体与方法

    在 Golang 中,结构体和方法是实现面向对象编程的重要组成部分,也是 Golang 的核心概念之一。在本篇文章中,我们将深入介绍 Golang 结构体与方法的概念、使用方法以及相关的编程技巧和最佳实践
    2023-04-04
  • 一文带你了解Go语言fmt标准库输出函数的使用

    一文带你了解Go语言fmt标准库输出函数的使用

    这篇文章主要为大家详细介绍了Go语言中 fmt 标准库输出函数的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • Go打包附件内容到执行文件的方法

    Go打包附件内容到执行文件的方法

    处于种种原因, 我们不希望这部分额外的内容以附件的形式出现, 有没有什么办法能够将附件内容直接打包进可执行文件中呢,下面小编给大家介绍下Go打包附件内容到执行文件的方法,感兴趣的朋友一起看看吧
    2023-03-03
  • go语言for循环中嵌套defer的执行顺序

    go语言for循环中嵌套defer的执行顺序

    在Go语言中,defer语句用于延迟函数调用的执行,本文主要介绍了go语言for循环中嵌套defer的执行顺序,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Go语言七篇入门教程四通道及Goroutine

    Go语言七篇入门教程四通道及Goroutine

    这篇文章主要为大家介绍了Go语言的通道及Goroutine示例详解,本文是Go语言七篇入门系列篇,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • windows安装部署go超详细实战记录(实测有用!)

    windows安装部署go超详细实战记录(实测有用!)

    Golang语言在近年来因为其高性能、编译速度快、开发成本低等特点逐渐得到大家的青睐,这篇文章主要给大家介绍了关于windows安装部署go超详细实战的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论