前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go源码分析(四) net包获取主机ip 子网掩码相关分析

go源码分析(四) net包获取主机ip 子网掩码相关分析

作者头像
杜争斌
发布2022-04-27 19:21:57
1K0
发布2022-04-27 19:21:57
举报
文章被收录于专栏:我的博文

获取本地的ip时 顺便学习了下标准库net中的实现

在net/interface.go中进行了入口调用,返回值为Addr的slice

代码语言:javascript
复制
func InterfaceAddrs() ([]Addr, error) {
 ifat, err := interfaceAddrTable(nil)
 if err != nil {
 err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
    }
 return ifat, err
}

具体平台实现interfaceAddrTable代码见net/interface_arch.go

以linux的为例在net/interface_linux.go中进行了实现

代码语言:javascript
复制
func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
 tab, err := syscall.NetlinkRIB(syscall.RTM_GETADDR, syscall.AF_UNSPEC)
 if err != nil {
 return nil, os.NewSyscallError("netlinkrib", err)
    }
 msgs, err := syscall.ParseNetlinkMessage(tab)
 if err != nil {
 return nil, os.NewSyscallError("parsenetlinkmessage", err)
    }
 var ift []Interface
 if ifi == nil {
 var err error
 ift, err = interfaceTable(0)
 if err != nil {
 return nil, err
        }
    }
 ifat, err := addrTable(ift, ifi, msgs)
 if err != nil {
 return nil, err
    }
 return ifat, nil
}

返回值为Addr的slice

Addr是一个包含IP和Mask的struct类型net.IPNet的slice

其他知识点

字符串转IP类型,支持IPv4和IPv6,IP类型转字符串

代码语言:javascript
复制
var ip net.IP
ip_str := "192.168.1.1"
ip = net.ParseIP(ip_str)
ip_str2 := ip.String()
func (ip IP) String() string

判断ip是否在该网卡段内

代码语言:javascript
复制
func (n *IPNet) Contains(ip IP) bool

结束

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档