獲取本地的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
結束
