Created
October 20, 2021 18:17
-
-
Save Michal-Szczepaniak/71593051595331bbcbae62a4ce19fb90 to your computer and use it in GitHub Desktop.
Nim async UDP server discovery and TCP server connection
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
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() |
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
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