Skip to content

Instantly share code, notes, and snippets.

@Michal-Szczepaniak
Created October 20, 2021 18:17
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Michal-Szczepaniak/71593051595331bbcbae62a4ce19fb90 to your computer and use it in GitHub Desktop.
Save Michal-Szczepaniak/71593051595331bbcbae62a4ce19fb90 to your computer and use it in GitHub Desktop.
Nim async UDP server discovery and TCP server connection
import asyncnet, asyncdispatch, nativesockets
proc discover(): Future[string] {.async.} =
let socket = newAsyncSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
socket.setSockOpt(OptReuseAddr, true)
socket.setSockOpt(OptReusePort, true)
socket.setSockOpt(OptBroadcast, true)
await socket.sendTo("255.255.255.255", Port(12346), $0b10)
var data = await socket.recvFrom(15)
echo "Discovered server at: " & data.address
return data.address
proc discoverAndConnect() {.async.} =
var server = await discover()
if server == "": return
var client = newAsyncSocket()
await client.connect(server, Port(12345))
if client.isClosed: return
await client.send("hello\n")
echo await client.recvLine()
client.close()
waitFor discoverAndConnect()
import asyncnet, asyncdispatch, nativesockets, net
proc serveClient(client: AsyncSocket) {.async.} =
while true:
let line = await client.recvLine()
if line.len == 0: break
await client.send(line & "\c\L")
proc serveServer() {.async.} =
var server = newAsyncSocket()
server.setSockOpt(OptReuseAddr, true)
server.setSockOpt(OptReusePort, true)
server.bindAddr(Port(12345))
server.listen()
while true:
let client = await server.accept()
asyncCheck client.serveClient()
proc serveDiscover() {.async.} =
var server = newAsyncSocket(protocol = IPPROTO_UDP, sockType = SOCK_DGRAM)
server.setSockOpt(OptReuseAddr, true)
server.setSockOpt(OptReusePort, true)
server.setSockOpt(OptBroadcast, true)
server.bindAddr(Port(12346))
while true:
var
data: tuple[data: string, address: string, port: Port] = await server.recvFrom(1)
if data.data == $0b10:
await server.sendTo(data.address, data.port, $getPrimaryIPAddr(parseIpAddress(data.address)))
asyncCheck serveDiscover()
asyncCheck serveServer()
runForever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment