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

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

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

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中进行了实现

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类型转字符串

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是否在该网卡段内

func (n *IPNet) Contains(ip IP) bool

结束

posted @ 2018-12-06 14:30  杜争斌  阅读(1721)  评论(0编辑  收藏  举报