2021-01-17 21:46:25 +08:00
|
|
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
2020-05-16 15:35:21 +08:00
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
//
|
|
|
|
|
|
|
|
package gipv4
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2020-05-18 23:50:31 +08:00
|
|
|
// GetIpArray retrieves and returns all the ip of current host.
|
|
|
|
func GetIpArray() (ips []string, err error) {
|
2020-05-16 15:35:21 +08:00
|
|
|
interfaceAddr, err := net.InterfaceAddrs()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
for _, address := range interfaceAddr {
|
|
|
|
ipNet, isValidIpNet := address.(*net.IPNet)
|
|
|
|
if isValidIpNet && !ipNet.IP.IsLoopback() {
|
|
|
|
if ipNet.IP.To4() != nil {
|
|
|
|
ips = append(ips, ipNet.IP.String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ips, nil
|
|
|
|
}
|
|
|
|
|
2020-05-18 23:50:31 +08:00
|
|
|
// GetIntranetIp retrieves and returns the first intranet ip of current machine.
|
|
|
|
func GetIntranetIp() (ip string, err error) {
|
|
|
|
ips, err := GetIntranetIpArray()
|
2020-05-16 15:35:21 +08:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
if len(ips) == 0 {
|
|
|
|
return "", errors.New("no intranet ip found")
|
|
|
|
}
|
|
|
|
return ips[0], nil
|
|
|
|
}
|
|
|
|
|
2020-05-18 23:50:31 +08:00
|
|
|
// GetIntranetIpArray retrieves and returns the intranet ip list of current machine.
|
|
|
|
func GetIntranetIpArray() (ips []string, err error) {
|
2020-05-16 15:35:21 +08:00
|
|
|
interFaces, e := net.Interfaces()
|
|
|
|
if e != nil {
|
|
|
|
return ips, e
|
|
|
|
}
|
|
|
|
for _, interFace := range interFaces {
|
|
|
|
if interFace.Flags&net.FlagUp == 0 {
|
|
|
|
// interface down
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if interFace.Flags&net.FlagLoopback != 0 {
|
|
|
|
// loopback interface
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// ignore warden bridge
|
|
|
|
if strings.HasPrefix(interFace.Name, "w-") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
addresses, e := interFace.Addrs()
|
|
|
|
if e != nil {
|
|
|
|
return ips, e
|
|
|
|
}
|
|
|
|
for _, addr := range addresses {
|
|
|
|
var ip net.IP
|
|
|
|
switch v := addr.(type) {
|
|
|
|
case *net.IPNet:
|
|
|
|
ip = v.IP
|
|
|
|
case *net.IPAddr:
|
|
|
|
ip = v.IP
|
|
|
|
}
|
|
|
|
|
|
|
|
if ip == nil || ip.IsLoopback() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
ip = ip.To4()
|
|
|
|
if ip == nil {
|
|
|
|
// not an ipv4 address
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
ipStr := ip.String()
|
|
|
|
if IsIntranet(ipStr) {
|
|
|
|
ips = append(ips, ipStr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ips, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsIntranet checks and returns whether given ip an intranet ip.
|
|
|
|
//
|
|
|
|
// Local: 127.0.0.1
|
|
|
|
// A: 10.0.0.0--10.255.255.255
|
|
|
|
// B: 172.16.0.0--172.31.255.255
|
|
|
|
// C: 192.168.0.0--192.168.255.255
|
|
|
|
func IsIntranet(ip string) bool {
|
|
|
|
if ip == "127.0.0.1" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
array := strings.Split(ip, ".")
|
|
|
|
if len(array) != 4 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
// A
|
|
|
|
if array[0] == "10" || (array[0] == "192" && array[1] == "168") {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
// C
|
|
|
|
if array[0] == "192" && array[1] == "168" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
// B
|
|
|
|
if array[0] == "172" {
|
|
|
|
second, err := strconv.ParseInt(array[1], 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if second >= 16 && second <= 31 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|