/
addr.go
106 lines (84 loc) · 1.69 KB
/
addr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package utils
import (
"encoding/binary"
"errors"
"net"
"strconv"
"strings"
)
var defaultIP = ""
type addr int
const Addr addr = iota
func (a addr) GetLocalhostIp() string {
if defaultIP != "" {
return defaultIP
}
addresses, err := net.InterfaceAddrs()
if err != nil {
defaultIP = "127.0.0.1"
return defaultIP
}
for i := 0; i < len(addresses); i++ {
// 检查ip地址判断是否回环地址
if ipNet, ok := addresses[i].(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
defaultIP = ipNet.IP.String()
return defaultIP
}
}
}
defaultIP = "127.0.0.1"
return defaultIP
}
func (a addr) Ip2long(ipStr string) uint32 {
ip := net.ParseIP(ipStr)
if ip == nil {
return 0
}
ip = ip.To4()
return binary.BigEndian.Uint32(ip)
}
func (a addr) IsLocalIP(ip string) bool {
return a.IsLocalNet(net.ParseIP(ip))
}
var localNetworks = []string{
"10.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"172.17.0.0/12",
"172.18.0.0/12",
"172.19.0.0/12",
"172.20.0.0/12",
"172.21.0.0/12",
"172.22.0.0/12",
"172.23.0.0/12",
"172.24.0.0/12",
"172.25.0.0/12",
"172.26.0.0/12",
"172.27.0.0/12",
"172.28.0.0/12",
"172.29.0.0/12",
"172.30.0.0/12",
"172.31.0.0/12",
"192.168.0.0/16",
}
func (a addr) IsLocalNet(ip net.IP) bool {
for i := 0; i < len(localNetworks); i++ {
if strings.Contains(localNetworks[i], ip.String()) {
return true
}
}
return ip.IsLoopback()
}
func (a addr) Parse(host string) (string, int, error) {
var u = strings.Split(host, ":")
if len(u) == 0 || len(u) > 2 {
return "", 0, errors.New("invalid host")
}
if len(u) == 1 {
return u[0], 80, nil
}
var ip = u[0]
var port, _ = strconv.Atoi(u[1])
return ip, port, nil
}