Last active
July 23, 2020 19:26
-
-
Save padurean/1061362c7443610f07660fcb528b3d4e to your computer and use it in GitHub Desktop.
Two ways to get the current local IP in Go #Golang
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"errors" | |
"fmt" | |
"net" | |
) | |
func main() { | |
localIP, err := getLocalIPFromNetInterfaces() | |
if err != nil { | |
fmt.Println(err) | |
os.Exit(1) | |
} | |
fmt.Printf("%-32s : %s\n", "Local IP from network interfaces", localIP) | |
localIP, err = getLocalIPByUDPDialing() | |
if err != nil { | |
fmt.Println(err) | |
os.Exit(1) | |
} | |
fmt.Printf("%-32s : %s\n", "Local IP from UDP dial", localIP) | |
} | |
func getLocalIPFromNetInterfaces() (string, error) { | |
ifaces, err := net.Interfaces() | |
if err != nil { | |
return "", err | |
} | |
for _, iface := range ifaces { | |
if iface.Flags&net.FlagUp == 0 { | |
continue // interface down | |
} | |
if iface.Flags&net.FlagLoopback != 0 { | |
continue // loopback interface | |
} | |
addrs, err := iface.Addrs() | |
if err != nil { | |
return "", err | |
} | |
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 { | |
ip = ip.To16() | |
if ip == nil { | |
continue | |
} | |
} | |
return ip.String(), nil | |
} | |
} | |
return "", errors.New("this machine is not connected to a network") | |
} | |
func getLocalIPByUDPDialing() (string, error) { | |
// UDP connection => there is no handshake => also works if offline | |
conn, err := net.Dial("udp", "1.2.3.4:1") | |
if err != nil { | |
return "", err | |
} | |
defer conn.Close() | |
localAddr := conn.LocalAddr().(*net.UDPAddr) | |
return localAddr.IP.String(), nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment