getlanip.go 840 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package internal
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. // GetLANIP returns the first non-loopback IPv4 LAN IP address.
  7. func GetLANIP() (net.IP, error) {
  8. ifaces, err := net.Interfaces()
  9. if err != nil {
  10. return nil, err
  11. }
  12. for _, iface := range ifaces {
  13. // Skip down or loopback interfaces
  14. if iface.Flags&(net.FlagUp|net.FlagLoopback) != net.FlagUp {
  15. continue
  16. }
  17. addrs, err := iface.Addrs()
  18. if err != nil {
  19. continue // skip interfaces we can't query
  20. }
  21. for _, addr := range addrs {
  22. var ip net.IP
  23. switch v := addr.(type) {
  24. case *net.IPNet:
  25. ip = v.IP
  26. case *net.IPAddr:
  27. ip = v.IP
  28. }
  29. if ip == nil || ip.IsLoopback() {
  30. continue
  31. }
  32. ip = ip.To4()
  33. if ip == nil {
  34. continue // not an IPv4 address
  35. }
  36. return ip, nil
  37. }
  38. }
  39. return nil, fmt.Errorf("no connected LAN IPv4 address found")
  40. }