net.go 702 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package otherutils
  2. import (
  3. "errors"
  4. "net"
  5. )
  6. func privateIPv4() (net.IP, error) {
  7. as, err := net.InterfaceAddrs()
  8. if err != nil {
  9. return nil, err
  10. }
  11. for _, a := range as {
  12. ipnet, ok := a.(*net.IPNet)
  13. if !ok || ipnet.IP.IsLoopback() {
  14. continue
  15. }
  16. ip := ipnet.IP.To4()
  17. if isPrivateIPv4(ip) {
  18. return ip, nil
  19. }
  20. }
  21. return nil, errors.New("no private ip address")
  22. }
  23. func isPrivateIPv4(ip net.IP) bool {
  24. return ip != nil &&
  25. (ip[0] == 10 || ip[0] == 172 && (ip[1] >= 16 && ip[1] < 32) || ip[0] == 192 && ip[1] == 168)
  26. }
  27. func lower16BitPrivateIP() (uint16, error) {
  28. ip, err := privateIPv4()
  29. if err != nil {
  30. return 0, err
  31. }
  32. return uint16(ip[2])<<8 + uint16(ip[3]), nil
  33. }