Browse Source

adding backup local ip function

afeiszli 3 years ago
parent
commit
80eb6a8cee
1 changed files with 46 additions and 0 deletions
  1. 46 0
      netclient/functions/common.go

+ 46 - 0
netclient/functions/common.go

@@ -56,12 +56,58 @@ func getPrivateAddr() (string, error) {
 	localAddr := conn.LocalAddr().(*net.UDPAddr)
 	localIP := localAddr.IP
 	local = localIP.String()
+	if local == "" {
+		local, err = getPrivateAddrBackup()
+	}
 	if local == "" {
 		err = errors.New("could not find local ip")
 	}
 	return local, err
 }
 
+func getPrivateAddrBackup() (string, error) {
+	ifaces, err := net.Interfaces()
+	if err != nil {
+		return "", err
+	}
+	var local string
+	found := false
+	for _, i := range ifaces {
+		if i.Flags&net.FlagUp == 0 {
+			continue // interface down
+		}
+		if i.Flags&net.FlagLoopback != 0 {
+			continue // loopback interface
+		}
+		addrs, err := i.Addrs()
+		if err != nil {
+			return "", err
+		}
+		for _, addr := range addrs {
+			var ip net.IP
+			switch v := addr.(type) {
+			case *net.IPNet:
+				if !found {
+					ip = v.IP
+					local = ip.String()
+					found = true
+				}
+			case *net.IPAddr:
+				if !found {
+					ip = v.IP
+					local = ip.String()
+					found = true
+				}
+			}
+		}
+	}
+	if !found {
+		err := errors.New("Local Address Not Found.")
+		return "", err
+	}
+	return local, err
+}
+
 func needInterfaceUpdate(ctx context.Context, mac string, network string, iface string) (bool, string, error) {
 	var header metadata.MD
 	req := &nodepb.Object{