当前位置: 首页 > news >正文

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

文章目录

  • 获取IPv4地址
  • 获取WLAN的IPv4地址
  • 获取本机公网IP地址

获取IPv4地址

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

package mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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

http://www.lryc.cn/news/183121.html

相关文章:

  • Android自定义Drawable---灵活多变的矩形背景
  • ParagonNTFSforMac_15.5.102中文版最受欢迎的NTFS硬盘格式读取工具
  • Kafka 搭建过程
  • 七、2023.10.1.Linux(一).7
  • 一文教你搞懂Redis集群
  • 树上启发式合并 待补
  • minio分布式文件存储
  • Linux新的IO模型io_uring
  • FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍
  • 数组篇 第一题:删除排序数组中的重复项
  • 堆的初步认识
  • CycleGAN模型之Pytorch实战
  • C++(STL容器适配器)
  • 软考 系统架构设计师系列知识点之软件架构风格(7)
  • 【Vue3】自定义指令
  • UG\NX CAM二次开发 加工模块获取 UF _ask_application_module
  • 借助GPU算力编译Android
  • docker-compose一键部署mysql
  • MATLAB 函数签名器
  • 2019强网杯随便注bugktu sql注入
  • Html+Css+Js计算时间差,返回相差的天/时/分/秒(从未来的一个日期时间到当前日期时间的差)。
  • mybatis项目启动报错:reader entry: ���� = v
  • 【GIT版本控制】--什么是版本控制
  • ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端
  • GEE16: 区域日均降水量计算
  • 打开MySQL数据库
  • 玩转ChatGPT:DALL·E 3生成图像
  • 小程序入门笔记(一) 黑马程序员前端微信小程序开发教程
  • 【进程管理】初识进程
  • ArcGIS Maps SDK for JS:监听按钮点击事件控制图层的visible属性