github.com/cnotch/ipchub@v1.1.0/network/addr.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package network 6 7 import ( 8 "fmt" 9 "net" 10 "strings" 11 12 "github.com/emitter-io/address" 13 ) 14 15 // GetIP 获取IP信息 16 func GetIP(addr net.Addr) string { 17 s := addr.String() 18 i := strings.LastIndex(s, ":") 19 return s[:i] 20 } 21 22 // GetLocalIP 获取本地IP 23 func GetLocalIP() []string { 24 addrs, _ := net.InterfaceAddrs() 25 ips := []string{} 26 for _, address := range addrs { 27 // 检查ip地址判断是否回环地址 28 if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { 29 if ipnet.IP.To4() != nil { 30 ips = append(ips, ipnet.IP.String()) 31 } 32 } 33 } 34 return ips 35 } 36 37 // IsLocalhostIP 判断是否为本机IP 38 func IsLocalhostIP(ip net.IP) bool { 39 for _, localhost := range loopbackBlocks { 40 if localhost.Contains(ip) { 41 return true 42 } 43 } 44 privs, err := address.GetPrivate() 45 if err != nil { 46 return false 47 } 48 49 for _, priv := range privs { 50 if priv.IP.Equal(ip) { 51 return true 52 } 53 } 54 55 return false 56 } 57 58 var loopbackBlocks = []*net.IPNet{ 59 parseCIDR("0.0.0.0/8"), // RFC 1918 IPv4 loopback address 60 parseCIDR("127.0.0.0/8"), // RFC 1122 IPv4 loopback address 61 parseCIDR("::1/128"), // RFC 1884 IPv6 loopback address 62 } 63 64 func parseCIDR(s string) *net.IPNet { 65 _, block, err := net.ParseCIDR(s) 66 if err != nil { 67 panic(fmt.Sprintf("Bad CIDR %s: %s", s, err)) 68 } 69 return block 70 }