Go 获取 IP 地址

这篇具有很好参考价值的文章主要介绍了Go 获取 IP 地址。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 地址。


Go 获取 IP 地址

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特文章来源地址https://www.toymoban.com/news/detail-748911.html


到了这里,关于Go 获取 IP 地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rust获取本地ip地址的方法

    大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info的使用。 get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]get_local_info 0.2.3-CSDN博客 首先在你的工程添加它 然后引

    2024年01月17日
    浏览(46)
  • 浏览器获取本地IP地址(不是浏览器的url地址的ip)

    浏览器输入: edge://flags/#enable-webrtc-hide-local-ips-with-mdns Anonymize local IPs exposed by WebRTC 状态改为disable JS方法: function f() { if(typeof window != \\\'undefined\\\'){ var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var rtc = new RTCPeerConnection() rtc.createDataChannel(\\\'\\\'

    2024年02月02日
    浏览(73)
  • rust获取本地外网ip地址的方法

    大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info的使用。 get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]get_local_info 0.2.3-CSDN博客 首先在你的工程添加它 然后引

    2024年01月18日
    浏览(61)
  • 使用CMD获取家庭出口IP地址

    是的,可以使用CMD命令行获取家庭出口IP地址。不过需要使用第三方命令行工具或在线服务,例如: 在线服务 ipinfo.io 提供了REST API来获取IP地址,可以使用Windows的 curl 命令,或者其他HTTP工具完成查询。例如: 这个命令会返回当前设备的家庭出口IP地址。 也可以使用Windows下的

    2024年02月07日
    浏览(31)
  • 使用adb命令获取手机ip地址

    最近一个项目需要使用adb开启服务,然后客户端使用安卓设备的IP地址连接到服务。 目前每次开启服务之后,都需要在安卓设备查看IP后输入连接,非常的麻烦。于是我想着试用adb获取IP,试过ifconfig等命令都没有用。 最后我找到了以下命令: adb shell ip addr show wlan0 wlan0就是无

    2024年02月11日
    浏览(55)
  • 使用curl命令行工具查询本地公网IP地址

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,同时也可以查询本机公网IP地址,具体使用方法如下: 1、使用curl ipinfo.io查询; 返回值 2、使用curl ifconfig.me查询;  返回值 3、使用ipinfo.io加ip地址,可查询这个ip的信息;  返回值  4、此命令在Windows的命令提示

    2024年02月14日
    浏览(37)
  • 使用Java获取发送请求的电脑的IP地址

    客户端所有的请求信息都可以通过HttpServletRequest获得,获取客户端ip可以通过getRemoteAddr()获取。 但是如果客户端是通过代理访问我们的服务器,那么getRemoteAddr()获取到的ip就很有可能不是真实的ip,这时候我们可以通过请求头里的x-forwarded-for来获取真实的ip,请求每经一次代理

    2024年02月16日
    浏览(38)
  • Java中使用HttpRequest获取用户真实IP地址端口

    获取请求来源ip代码: 获取请求来源端口代码:

    2024年02月11日
    浏览(67)
  • Go新项目-Golang使用RemoteAddr()获取远程主机地址的注意事项(9)

    http.Request 下的方法RemoteAddr() 可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。 使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1 。 对于这个问题一直百思不得其解,最后搞了半天才发现是nginx 的原因。

    2024年01月20日
    浏览(59)
  • 在Linux系统中,可以使用ping和telnet命令来测试IP地址和端口是否连通

    在Linux系统中,可以使用ping和telnet命令来测试IP地址和端口是否连通。 使用ping命令测试IP是否连通: 例如: 如果ping通了,会出现类似如下的输出: 如果无法ping通,则会出现类似如下的输出: 使用telnet命令测试端口是否开放: 例如: 如果端口开放,则会出现连接成功的信

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包