Go 获取 IP 地址

打印 上一主题 下一主题

主题 930|帖子 930|积分 2790

1. 获取本地IP地址

使用 net 包可以获取本地机器的 IP 地址。以下是一个获取本地 IP 地址的简单示例:
  1. package main
  2. import (
  3.         "fmt"
  4.         "net"
  5. )
  6. func main() {
  7.         // 获取所有网络接口
  8.         interfaces, err := net.Interfaces()
  9.         if err != nil {
  10.                 fmt.Println("Error:", err)
  11.                 return
  12.         }
  13.         // 遍历所有网络接口
  14.         for _, iface := range interfaces {
  15.                 // 排除一些特殊接口
  16.                 if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 {
  17.                         continue
  18.                 }
  19.                 // 获取接口的地址信息
  20.                 addrs, err := iface.Addrs()
  21.                 if err != nil {
  22.                         fmt.Println("Error:", err)
  23.                         continue
  24.                 }
  25.                 // 遍历接口的地址
  26.                 for _, addr := range addrs {
  27.                         // 检查地址类型
  28.                         switch v := addr.(type) {
  29.                         case *net.IPNet:
  30.                                 // IPv4 或 IPv6 地址
  31.                                 fmt.Println(v.IP)
  32.                         case *net.IPAddr:
  33.                                 // 一般情况下是 IPv4 地址
  34.                                 fmt.Println(v.IP)
  35.                         }
  36.                 }
  37.         }
  38. }
复制代码
2. 使用 net/http 获取客户端 IP

在 Go 中,可以使用 net/http 包中的 Request 结构体来获取客户端的 IP 地址。具体来说,Request 结构体中的 RemoteAddr 字段包含了客户端的 IP 地址和端口号。
  1. type Request struct {
  2.     ...
  3.     // RemoteAddr allows HTTP servers and other software to record
  4.         // the network address that sent the request, usually for
  5.         // logging. This field is not filled in by ReadRequest and
  6.         // has no defined format. The HTTP server in this package
  7.         // sets RemoteAddr to an "IP:port" address before invoking a
  8.         // handler.
  9.         // This field is ignored by the HTTP client.
  10.         RemoteAddr string
  11.     ...
  12. }
复制代码
以下是一个简单的示例:
  1. package main
  2. import (
  3.         "fmt"
  4.         "net/http"
  5. )
  6. func main() {
  7.         http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  8.                 // 通过 RemoteAddr 获取客户端的 IP 地址和端口号
  9.                 ip, _, err := net.SplitHostPort(r.RemoteAddr)
  10.                 if err != nil {
  11.                         fmt.Println("Error extracting IP:", err)
  12.                         return
  13.                 }
  14.                 fmt.Fprintf(w, "Client IP: %s", ip)
  15.         })
  16.         // 启动 HTTP 服务器,监听在 8080 端口
  17.         http.ListenAndServe(":8080", nil)
  18. }
复制代码
在这个例子中,r.RemoteAddr 包含了客户端的 IP 地址和端口号,使用 net.SplitHostPort 函数可以方便地从这个字符串中提取出 IP 地址。请注意,由于这个方法使用 TCP 连接的信息,所以对于某些代理服务器或负载均衡器,它可能只是代理服务器的 IP 地址,而不是实际客户端的 IP 地址。在这种情况下,可能需要查看 HTTP 头部中的相关字段以获取真实的客户端 IP 地址。
3. 使用 gin 获取客户端 IP

在 Gin 框架中,可以通过 c.ClientIP() 方法获取客户端的 IP 地址。这个方法会尝试从不同的来源获取 IP 地址,包括 X-Forwarded-For 头部、X-Real-IP 头部以及连接的远程地址。
  1. // ClientIP implements one best effort algorithm to return the real client IP.
  2. // It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not.
  3. // If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]).
  4. // If the headers are not syntactically valid OR the remote IP does not correspond to a trusted proxy, the remote IP (coming from Request.RemoteAddr) is returned.
  5. func (c *Context) ClientIP() string
复制代码
以下是一个简单的示例:
  1. package main
  2. import (
  3.         "github.com/gin-gonic/gin"
  4.         "net/http"
  5. )
  6. func main() {
  7.         r := gin.Default()
  8.         r.GET("/", func(c *gin.Context) {
  9.                 // 获取客户端的 IP 地址
  10.                 clientIP := c.ClientIP()
  11.                 c.String(http.StatusOK, "Client IP: %s", clientIP)
  12.         })
  13.         // 启动 Gin 服务器,监听在 8080 端口
  14.         r.Run(":8080")
  15. }
复制代码
在这个例子中,c.ClientIP() 会自动处理不同的头部并返回客户端的 IP 地址。如果的应用程序部署在代理服务器或负载均衡器之后,确保这些设备正确地设置了 X-Forwarded-For 或 X-Real-IP 头部,以便正确获取客户端的 IP 地址。
  
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表