用go获取IPv4地址,WLAN的IPv4地址,本机公网IP地址,本机空闲端口详解

news2025/1/9 20:12:02

文章目录

  • 获取IPv4地址
  • 获取WLAN的IPv4地址
  • 获取本机公网IP地址
  • 获取本机空闲端口

获取IPv4地址

下面的代码会打印出本机所有的IPv4地址。这个方法可能会返回多个IP地址,因为一台机器可能有多个网络接口,每个接口可能有一个或多个IP地址。

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	for _, addr := range addrs {
		if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				fmt.Println("IPv4: ", ipnet.IP.String())
			}
		}
	}
}

运行结果:

IPv4:  169.254.157.225
IPv4:  169.254.28.142
IPv4:  169.254.211.187
IPv4:  192.168.144.1
IPv4:  192.168.253.1
IPv4:  10.252.64.116
IPv4:  169.254.106.194
IPv4:  169.254.109.149
IPv4:  172.28.240.1

甚至比我在终端使用ipconfig命令得到的IPv4地址还要多。
image-20231005095013864

获取WLAN的IPv4地址

当然这么多IPv4地址并不一定都是我们想要的,对于用wifi上网的电脑,我们想获取无线局域网适配器 WLAN的IPv4地址可以按下面的代码操作:

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	interfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	for _, i := range interfaces {
		if i.Name == "WLAN" {
			addrs, err := i.Addrs()
			if err != nil {
				fmt.Println(err)
				continue
			}

			for _, addr := range addrs {
				if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
					if ipnet.IP.To4() != nil {
						fmt.Println("IPv4: ", ipnet.IP.String())
					}
				}
			}
		}
	}
}

运行结果:

IPv4:  10.252.64.116

经过和上图比对,结果正确。

获取本机公网IP地址

那如果我们想获取本机的公网IP地址,那该怎么操作呢?我这里介绍两种方法:

第一种方法将通过与Google的公共DNS服务器建立UDP连接来获取公网IP地址。

package main

import (
	"fmt"
	"net"
)

func main() {
	conn, err := net.Dial("udp", "8.8.8.8:80")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()

	localAddr := conn.LocalAddr().(*net.UDPAddr)

	fmt.Println("My public IP address is:", localAddr.IP.String())
}

运行结果:

My public IP address is: 10.252.64.116

经过比对,结果正确。我们可以发现如果我们的电脑是用WiFi上网的,用此方法得出的结果与WLAN的IPv4地址相同。

第二种方法依赖于第三方服务,如果该服务不可用,可能无法获取到IP地址。此外,由于这个方法涉及到网络通信,所以可能会比获取本地IP地址慢一些。同时该方法出错的风险也较高。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	resp, err := http.Get("https://api.ipify.org")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer resp.Body.Close()

	ip, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("My public IP address is: ", string(ip))
}

除了使用 https://api.ipify.org,还有其他一些服务可以提供公网IP地址,例如 https://ifconfig.mehttps://icanhazip.com

获取本机空闲端口

此方法可以动态获取本机的空闲端口,比如说你有web应用需要上线,就不用自己手动指定端口了。

package main

import (
	"fmt"
	"net"
)

func main() {
	addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
	if err != nil {
		panic(err)
	}

	l, err := net.ListenTCP("tcp", addr)
	if err != nil {
		panic(err)
	}
	defer l.Close()
	port := l.Addr().(*net.TCPAddr).Port
	fmt.Println(port)
}

运行结果:

54791

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Graph RAG: 知识图谱结合 LLM 的检索增强

本文为大家揭示 NebulaGraph 率先提出的 Graph RAG 方法,这种结合知识图谱、图数据库作为大模型结合私有知识系统的最新技术栈,是 LLM 系列的第三篇,加上之前的图上下文学习、Text2Cypher 这两篇文章,目前 NebulaGraph LLM 相关的…

接口测试——接口协议抓包分析与mock_L3

目录: 弱网测试mock的价值与意义mock实战练习 Rewrite 原理Map Local 原理Map Remote 原理使用curl发送请求tcpdump与wireshark的使用 1.弱网测试 什么是弱网测试? 按照移动的特性,一般应用低于 3G、弱信号的 Wifi 可以划分为弱网弱网测试…

im即时通讯系统源码/如何搭建一个自己的im即时通讯呢?

​一,思路梳理 1,首先思考群聊的实现方式。 每当一个用户使用websocket建立连接时,都会存放一个连接对象(在connectMap集合存放,键为sessionId,值为该连接对象),每次当用户发送一条…

js Learn(异步JavaScript)

在这个模块中,我们来看看异步JavaScript,为什么它很重要,以及如何使用它来有效地处理潜在的阻塞操作,比如从服务器获取资源。 指南 异步JavaScript介绍 在本文中,我们将学习同步(synchronous&#xff09…

TLR4-IN-C34-C2-COO,一种结合了TLR4抑制剂TLR4-IN-C34的连接器

TLR4-IN-C34-C2-COO是一种结合了TLR4抑制剂TLR4-IN-C34的连接器,在免疫调节中发挥重要作用,它通过抑制TLR4信号通路的传导,从而达到降低炎症反应的目的。TLR4是Toll样受体家族中的一员,它主要识别来自细菌和病毒的保守模式&#x…

零碳联盟:改变世界,实现绿色能源的共同梦想

如今,全球气候变暖已然成为我们面对的头等大事。温室气体的排放不断升高,导致地球温度上升,带来了严重的极端气候、冰川消融和海平面上升等问题。这一切都源于人类活动,特别是大规模使用化石燃料,如煤炭发电、供暖以及…

AIGC | LLM 提示工程 -- 如何向ChatGPT提问

当前生成式人工智能已经成为革命性的驱动源,正在迅速地重塑世界,将会改变我们生活方式和思考模式。LLM像一个学会了全部人类知识的通才,但这不意味每个人可以轻松驾驭这个通才。我们只有通过学习面向LLM的提示工程,才可以更好的让…

2023中考满分多少 中考总分数展示

中考总分根据地区而不同,以下是各地区总分数展示: 大部分地区的中考总分为750分,包括语文150分、数学150分、英语150分(其中听力测试30分)、思想品德与历史合卷共150分,物理与化学合卷共150分。 安徽中考…

计算机视觉--距离变换算法

计算机视觉 文章目录 计算机视觉前言距离变换 总结 前言 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中,我们将使用D4距离度量方法来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计…

flutter sdk提供完整页面的ui

1.完整ui页面 可以借鉴一些使用案例: return Placeholder();/// A widget that draws a box that represents where other widgets will one day /// be added. /// /// This widget is useful during development to indicate that the interface is /// not yet…

总结四:数据库(MySQL)面经

文章目录 一、SQL1、介绍一下数据库分页2、介绍一下SQL中的聚合函数3、表跟表是怎么关联的?4、说一说你对外连接的了解?5、说一说数据库的左连接和右连接?6、SQL中怎么将行转成列?7、谈谈你对SQL注入的理解?8、将一张表的部分数据…

车载激光雷达标定板在无人驾驶中的作用

在自动驾驶领域,激光雷达的作用主要是通过扫描周围环境,获取车辆行驶过程中路况和障碍物的位置和形状,并将数据和信号传递给自动驾驶系统,帮助其做出相应的驾驶决策。 激光雷达使其成为自动驾驶中不可或缺的组成部分。激光雷达可以…

Dremio:新一代数据湖仓引擎

Dremio数据湖引擎 1、什么是Dremio2、什么是数据湖仓2.1、数据湖仓的历史和演变 3、Dremio查询引擎(Dremio Sonar)3、Dremio特点1、唯一具有自助式SQL分析功能的数据湖仓2、数据完全开放,无锁定3、亚秒级性能,云数据仓库成本的1/1…

前后端分离计算机毕设项目之基于springboot+vue的房屋租赁系统《内含源码+文档+部署教程》

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

47 从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树 先序无法确定子树大小,中序找不到根;所以用先序找根,用中序找大小题解1 递归题解2 迭代 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同…

世界各国家地区3d地形图

1、GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图高级培训班 2、全流程R语言Meta分析核心技术 3、最新CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用 4、WOFOST模型与PCSE模型实践技术应用 5、Biome-BGC生态系统模型与Python融合技术实践应用 6、基于…

Sqlserver查看表的主键,删除主键,修改主键

1.查看表的结构 EXEC sp_help 表名; 查询使用 sp_help 存储过程,它将返回有关表的详细信息,包括列名、数据类型、约束等。你可以在结果中查找带有 “PK” 标记的列,它们表示主键约束。 2.查看表的主键信息 EXEC sp_pkeys 表名; 查询使用 sp_…

直线导轨精度等级在设备中有什么影响?

直线导轨的精度选择是直线导轨应用中的重要环节,需要根据具体的应用场景和设备要求来选择合适的精度等级(常见分3个等级:N/H/P)。下面我们来详细了解一下直线导轨的精度选择。 1、精度等级的概念:直线导轨的精度等级是…

linux查看系统信息命令

1.查看linux内核版本 [rootmaster ~]# uname -r 3.10.0-123.el7.x86_64 [rootmaster ~]# uname -a Linux master 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux2.查看文件系统的磁盘大小和剩余空间大小 [rootmaster ~]# df -h …

手机没电用日语怎么说?你会吗?柯桥常用日语学习

手机没电在日语里可以表达为: 1. スマホの電池が切れた。 直接使用“電池が切れる”来表示电池没有电了。 2. スマホのバッテリーが空に15857575376なった。 “バッテリーが空になる”也是表示电量耗尽的常用表达。 3. 充電が必要だ。 “充電が必要”意思是需要充电。 4…