golang http获取本机ip

admin 2025-01-10 23:15:51 编程 来源:ZONE.CI 全球网 0 阅读模式

最近在学习Golang的开发过程中,我遇到了一个常见的需求:获取本机IP地址。在HTTP开发中,有时候我们需要获取客户端的IP地址来做一些业务处理,比如限制某些IP的访问权限或者统计分析等。下面我将介绍如何使用Golang的HTTP库来获取本机IP。

第一段:使用net包获取本机IP

在Golang中,我们可以使用net包来获取本机IP地址。net包提供了一系列用于网络通信的函数和类型,包括IP地址的获取和操作。我们可以通过以下代码来实现获取本机IP的功能:

``` package main import ( "fmt" "net" ) func main() { addrs, err := net.InterfaceAddrs() if err != nil { fmt.Println(err) return } for _, addr := range addrs { ip, ok := addr.(*net.IPNet) if !ok || ip.IP.IsLoopback() { continue } if ip.IP.To4() != nil { fmt.Println(ip.IP.String()) } } } ``` 以上代码获取了本机所有接口的IP地址,并过滤掉了回环地址(127.0.0.1)。最后遍历剩余的IP地址,并将其打印出来。

第二段:使用http.Request获取客户端IP

Golang的HTTP库提供了Request结构体,其中封装了HTTP请求的相关信息,包括客户端IP地址。我们可以使用Request结构体的RemoteAddr字段来获取客户端的IP地址。以下是一个示例代码:

``` package main import ( "fmt" "net/http" "strings" ) func GetClientIP(r *http.Request) string { ip := r.Header.Get("X-Real-IP") if ip != "" { return ip } ip = r.Header.Get("X-Forwarded-For") if ip != "" { ips := strings.Split(ip, ",") return ips[0] } ip = strings.Split(r.RemoteAddr, ":")[0] return ip } func handler(w http.ResponseWriter, r *http.Request) { ip := GetClientIP(r) fmt.Fprintf(w, "Your IP address is %s\n", ip) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ``` 以上代码定义了一个handler函数来处理HTTP请求,并在其中调用GetClientIP函数来获取客户端IP地址。GetClientIP函数首先尝试从请求头中获取X-Real-IP字段的值,然后尝试获取X-Forwarded-For字段的值。如果这两个字段都不存在,则从RemoteAddr字段中获取IP地址。最后将获取到的IP地址返回给客户端。

第三段:使用第三方库获取本机IP

除了使用net包和HTTP库的方式外,我们还可以使用第三方库来获取本机IP地址。例如,go-socks5-proxy库提供了一个简单的方法来获取本机IP地址,代码如下:

``` package main import ( "fmt" "github.com/armon/go-socks5" ) func main() { var config = &socks5.Config{} server, err := socks5.New(config) if err != nil { fmt.Println(err) return } ips, err := server.ListenIP() if err != nil { fmt.Println(err) return } for _, ip := range ips { fmt.Println(ip) } } ``` 以上代码使用go-socks5-proxy库创建了一个简单的SOCKS5代理服务器,并通过调用ListenIP方法获取代理服务器绑定的本地IP地址。最后打印出获取到的IP地址。

至此,我们已经分别介绍了三种不同的方法来获取本机IP地址。使用net包可以获取操作系统上所有接口的IP地址,使用HTTP库的Request结构体可以获取客户端的IP地址,而使用第三方库则可以提供更多的选项和扩展功能。根据具体需求选择合适的方法,可以帮助我们更好地完成Golang的开发工作。

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  18