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  }