| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package internal
- import (
- "fmt"
- "net"
- )
- // GetLANIP returns the first non-loopback IPv4 LAN IP address.
- func GetLANIP() (net.IP, error) {
- ifaces, err := net.Interfaces()
- if err != nil {
- return nil, err
- }
- for _, iface := range ifaces {
- // Skip down or loopback interfaces
- if iface.Flags&(net.FlagUp|net.FlagLoopback) != net.FlagUp {
- continue
- }
- addrs, err := iface.Addrs()
- if err != nil {
- continue // skip interfaces we can't query
- }
- for _, addr := range addrs {
- 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 {
- continue // not an IPv4 address
- }
- return ip, nil
- }
- }
- return nil, fmt.Errorf("no connected LAN IPv4 address found")
- }
|