1. 獲取本地IP地址 使用 net 包可以獲取本地機器的 IP 地址。以下是一個獲取本地 IP 地址的簡單示例: package main import ( "fmt" "net" ) func main() { // 獲取所有網路介面 interfaces, err := net.Interfa ...
1. 獲取本地IP地址
使用 net
包可以獲取本地機器的 IP 地址。以下是一個獲取本地 IP 地址的簡單示例:
package main
import (
"fmt"
"net"
)
func main() {
// 獲取所有網路介面
interfaces, err := net.Interfaces()
if err != nil {
fmt.Println("Error:", err)
return
}
// 遍歷所有網路介面
for _, iface := range interfaces {
// 排除一些特殊介面
if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 {
continue
}
// 獲取介面的地址信息
addrs, err := iface.Addrs()
if err != nil {
fmt.Println("Error:", err)
continue
}
// 遍歷介面的地址
for _, addr := range addrs {
// 檢查地址類型
switch v := addr.(type) {
case *net.IPNet:
// IPv4 或 IPv6 地址
fmt.Println(v.IP)
case *net.IPAddr:
// 一般情況下是 IPv4 地址
fmt.Println(v.IP)
}
}
}
}
2. 使用 net/http
獲取客戶端 IP
在 Go 中,可以使用 net/http
包中的 Request
結構體來獲取客戶端的 IP 地址。具體來說,Request
結構體中的 RemoteAddr
欄位包含了客戶端的 IP 地址和埠號。
type Request struct {
...
// RemoteAddr allows HTTP servers and other software to record
// the network address that sent the request, usually for
// logging. This field is not filled in by ReadRequest and
// has no defined format. The HTTP server in this package
// sets RemoteAddr to an "IP:port" address before invoking a
// handler.
// This field is ignored by the HTTP client.
RemoteAddr string
...
}
以下是一個簡單的示例:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 通過 RemoteAddr 獲取客戶端的 IP 地址和埠號
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
fmt.Println("Error extracting IP:", err)
return
}
fmt.Fprintf(w, "Client IP: %s", ip)
})
// 啟動 HTTP 伺服器,監聽在 8080 埠
http.ListenAndServe(":8080", nil)
}
在這個例子中,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 頭部以及連接的遠程地址。
// ClientIP implements one best effort algorithm to return the real client IP.
// It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not.
// If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]).
// 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.
func (c *Context) ClientIP() string
以下是一個簡單的示例:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
// 獲取客戶端的 IP 地址
clientIP := c.ClientIP()
c.String(http.StatusOK, "Client IP: %s", clientIP)
})
// 啟動 Gin 伺服器,監聽在 8080 埠
r.Run(":8080")
}
在這個例子中,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: 戀水無意
騰訊雲開發者社區:孟斯特