网络相关
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

210 lines
4.3 KiB

3 years ago
  1. package network
  2. import (
  3. "errors"
  4. "net"
  5. "net/http"
  6. "strconv"
  7. "strings"
  8. )
  9. /**
  10. * 取本地IP
  11. */
  12. func GetLocalIps() []string {
  13. addrs, err := net.InterfaceAddrs()
  14. var list []string
  15. if err != nil {
  16. return list
  17. }
  18. for _, address := range addrs {
  19. // 检查ip地址判断是否回环地址
  20. if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  21. if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() {
  22. if IsPrivateIp(ipnet.IP.String()) {
  23. list = append(list, ipnet.IP.String())
  24. }
  25. }
  26. }
  27. }
  28. return list
  29. }
  30. /**
  31. * 取外网IP
  32. */
  33. func GetInternetIps() []string {
  34. addrs, err := net.InterfaceAddrs()
  35. var list []string
  36. if err != nil {
  37. return list
  38. }
  39. for _, address := range addrs {
  40. // 检查ip地址判断是否回环地址
  41. if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  42. if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() {
  43. if !IsPrivateIp(ipnet.IP.String()) {
  44. list = append(list, ipnet.IP.String())
  45. }
  46. }
  47. }
  48. }
  49. return list
  50. }
  51. /**
  52. * 是否本地(局域网)IP
  53. */
  54. func IsPrivateIp(ip string) bool {
  55. process_ip := getIpNumber(ip)
  56. /**
  57. * 私有IPA类 10.0.0.0 -10.255.255.255
  58. * B类 172.16.0.0 -172.31.255.255
  59. * C类 192.168.0.0 -192.168.255.255
  60. * D类 127.0.0.0 -127.255.255.255(环回地址)
  61. */
  62. a_begin := getIpNumber("10.0.0.0")
  63. a_end := getIpNumber("10.255.255.255")
  64. if process_ip >= a_begin && process_ip <= a_end {
  65. return true
  66. }
  67. b_begin := getIpNumber("172.16.0.0")
  68. b_end := getIpNumber("172.31.255.255")
  69. if process_ip >= b_begin && process_ip <= b_end {
  70. return true
  71. }
  72. c_begin := getIpNumber("192.168.0.0")
  73. c_end := getIpNumber("192.168.255.255")
  74. if process_ip >= c_begin && process_ip <= c_end {
  75. return true
  76. }
  77. d_begin := getIpNumber("127.0.0.0")
  78. d_end := getIpNumber("127.255.255.255")
  79. if process_ip >= d_begin && process_ip <= d_end {
  80. return true
  81. }
  82. return false
  83. }
  84. func getIpNumber(ip string) int64 {
  85. ip_segment := strings.Split(ip, ".")
  86. if len(ip_segment) != 4 {
  87. return -1
  88. }
  89. segment_1, _ := strconv.ParseInt(ip_segment[0], 10, 64)
  90. segment_2, _ := strconv.ParseInt(ip_segment[1], 10, 64)
  91. segment_3, _ := strconv.ParseInt(ip_segment[2], 10, 64)
  92. segment_4, _ := strconv.ParseInt(ip_segment[3], 10, 64)
  93. ip_num := segment_1*256*256*256 + segment_2*256*256 + segment_3*256 + segment_4
  94. return ip_num
  95. }
  96. /**
  97. * 取来源地址
  98. */
  99. func GetRemoteIp(req *http.Request) string {
  100. forward_ip := req.Header.Get("X-Forwarded-For") //使用代理
  101. if forward_ip != "" {
  102. forward_ips := strings.Split(forward_ip, ",")
  103. if len(forward_ips) > 0 && forward_ips[0] != "" {
  104. remoteIp, _, err := net.SplitHostPort(forward_ips[0])
  105. if err != nil {
  106. remoteIp = forward_ips[0]
  107. }
  108. return remoteIp
  109. }
  110. }
  111. if remoteIp, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
  112. return remoteIp
  113. }
  114. return req.RemoteAddr
  115. }
  116. /**
  117. * ip是否正确
  118. */
  119. func GetNumber(ip, mask string) (string, error) {
  120. a := net.ParseIP(ip)
  121. if a == nil {
  122. return "", errors.New("150057")
  123. }
  124. b := net.ParseIP(mask)
  125. if b == nil {
  126. return "", errors.New("150058")
  127. }
  128. ips := strings.Split(ip, ".")
  129. a1, _ := strconv.Atoi(ips[0])
  130. a2, _ := strconv.Atoi(ips[1])
  131. a3, _ := strconv.Atoi(ips[2])
  132. a4, _ := strconv.Atoi(ips[3])
  133. masks := strings.Split(mask, ".")
  134. m1, _ := strconv.Atoi(masks[0])
  135. m2, _ := strconv.Atoi(masks[1])
  136. m3, _ := strconv.Atoi(masks[2])
  137. m4, _ := strconv.Atoi(masks[3])
  138. n1 := a1 & m1
  139. n2 := a2 & m2
  140. n3 := a3 & m3
  141. n4 := a4 & m4
  142. return strconv.Itoa(n1) + "." + strconv.Itoa(n2) + "." + strconv.Itoa(n3) + "." + strconv.Itoa(n4), nil
  143. }
  144. /*
  145. * CIDR取IP mask
  146. * 2019/03/07
  147. */
  148. func GetIpMaskFromCIDR(ip string) (string, string, error) {
  149. ips, ipNet, err := net.ParseCIDR(ip)
  150. if err != nil {
  151. return "", "", err
  152. }
  153. val := make([]byte, len(ipNet.Mask))
  154. copy(val, ipNet.Mask)
  155. var s []string
  156. for _, i := range val[:] {
  157. s = append(s, strconv.Itoa(int(i)))
  158. }
  159. return ips.String(), strings.Join(s, "."), nil
  160. }
  161. /*
  162. * net mask转换, 255.255.255.0 -> 24
  163. * 2019/03/07
  164. */
  165. func ChangeMask(mask string) string {
  166. s := strings.Split(mask, ".")
  167. s1, _ := strconv.Atoi(s[0])
  168. s2, _ := strconv.Atoi(s[1])
  169. s3, _ := strconv.Atoi(s[2])
  170. s4, _ := strconv.Atoi(s[3])
  171. ipmask := net.IPv4Mask(byte(s1), byte(s2), byte(s3), byte(s4))
  172. ones, _ := ipmask.Size()
  173. return strconv.Itoa(ones)
  174. }