punchd/utils.nim

31 lines
1000 B
Nim

from net import
IpAddress, IpAddressFamily, Port, `$`, newSocket, connect, close,
getLocalAddr, parseIpAddress
from nativesockets import
Domain, SockType, Protocol
# FIXME: getPrimaryAddr is not needed anymore once
# https://github.com/nim-lang/Nim/pull/15538 is released.
proc getPrimaryIPAddr*(dest = parseIpAddress("8.8.8.8")): IpAddress =
## Finds the local IP address, usually assigned to eth0 on LAN or wlan0 on WiFi,
## used to reach an external address. Useful to run local services.
##
## No traffic is sent.
##
## Supports IPv4 and v6.
## Raises OSError if external networking is not set up.
##
## .. code-block:: Nim
## echo $getPrimaryIPAddr() # "192.168.1.2"
let socket =
if dest.family == IpAddressFamily.IPv4:
newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
else:
newSocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)
try:
socket.connect($dest, 80.Port)
result = socket.getLocalAddr()[0].parseIpAddress()
finally:
socket.close()