initial commit

This commit is contained in:
Christian Ulrich 2020-05-08 19:34:37 +02:00
commit 9aa7d66331
No known key found for this signature in database
GPG Key ID: 8241BE099775A097
2 changed files with 95 additions and 0 deletions

18
asyncreadline.nim Normal file
View File

@ -0,0 +1,18 @@
## asyncReadline as discussed at https://github.com/nim-lang/Nim/issues/11564
import asyncdispatch, threadpool
proc asyncReadline*(): Future[string] =
let event = newAsyncEvent()
let future = newFuture[string]("asyncReadline")
proc readlineBackground(event: AsyncEvent): string =
result = stdin.readline()
event.trigger()
let flowVar = spawn readlineBackground(event)
proc callback(fd: AsyncFD): bool =
future.complete(^flowVar)
true
addEvent(event, callback)
return future

77
syni_prototype.nim Normal file
View File

@ -0,0 +1,77 @@
import
asyncnet,
asyncdispatch,
asyncreadline
from strutils import format
from nativesockets import setSockOptInt
from os import paramCount, paramStr
var IPPROTO_IP {.importc: "IPPROTO_IP", header: "<netinet/in.h>".}: cint
var IP_TTL {.importc: "IP_TTL", header: "<netinet/in.h>".}: cint
proc usage() =
echo("Usage: $# client|server".format(paramStr(0)))
#proc punchHoleAsClient(socket: AsyncSocket) {.async.} =
#
proc processInput(client: AsyncSocket) {.async.} =
while true:
let input = await asyncReadline()
await client.send(input & "\c\L")
proc runClient() {.async.} =
var client = newAsyncSocket()
client.setSockOpt(OptReuseAddr, true)
client.getFd().setSockOptInt(IPPROTO_IP, IP_TTL, 2)
client.bindAddr(Port(1234))
try:
await client.connect("127.0.0.1", Port(4321))
let (address, port) = client.getPeerAddr()
echo("connected to $#:$#!".format(address, port.uint16))
asyncCheck processInput(client)
while true:
let line = await client.recvLine()
if line.len == 0: break
echo("server responded: $#".format(line))
except OSError as e:
echo("Error: $#".format(e.msg))
proc processClient(client: AsyncSocket) {.async.} =
while true:
let line = await client.recvLine()
if line.len == 0: break
echo("client sent message: $#".format(line))
await client.send(line & "\c\L")
proc runServer() {.async.} =
var server = newAsyncSocket()
server.setSockOpt(OptReuseAddr, true)
server.bindAddr(Port(4321))
server.listen()
echo("listening on port 4321")
while true:
let client = await server.accept()
let (address, port) = client.getPeerAddr()
echo("client $#:$# connected!".format(address, port.uint16()))
asyncCheck processClient(client)
proc main() =
if paramCount() != 1:
usage()
return
case paramStr(1)
of "client":
asyncCheck runClient()
of "server":
asyncCheck runServer()
else:
usage()
try:
runForever()
except ValueError:
discard
when isMainModule:
main()