Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import asyncdispatch, asyncnet, locks
- from osproc import countProcessors
- import httputils
- type
- Server = ref object
- socket: AsyncSocket
- proc newServer*(): Server = new result
- proc close*(server: Server) =
- server.socket.close()
- proc sendResp*(socket: AsyncSocket, code: HttpCode) {.async.} =
- await socket.send("HTTP/1.1 " & $code & "\c\L" &
- "Content-Length: " & $(($code).len + 2) & "\c\L\c\L" &
- $code & "\c\L")
- proc processMessage(server: Server, csocket: AsyncSocket) {.async.} =
- echo "threadid: " & $getThreadId()
- while not csocket.isClosed():
- try:
- let line = await csocket.recvLine()
- if line.len == 0:
- csocket.close()
- break
- await csocket.sendResp(Http200)
- except Exception as e:
- echo "Failed processClient(): " & e.msg
- break
- proc loop(server: Server, port = 5000){.async.} =
- server.socket = newAsyncSocket(buffered = false)
- server.socket.setSockOpt(OptReuseAddr, true)
- server.socket.setSockOpt(OptReusePort, true)
- server.socket.bindAddr(port.Port)
- server.socket.listen()
- while true:
- let (netAddr, clientSocket) = await server.socket.acceptAddr()
- echo "accepted connection from " & netAddr
- asyncCheck processMessage(server, clientSocket)
- proc runServer() =
- let svr = newServer()
- waitFor loop(svr)
- svr.close()
- proc start*() =
- let cores = countProcessors()
- var threads = newSeq[Thread[void]](cores)
- for i in 0 ..< cores:
- createThread[void](threads[i], runServer)
- echo("Listening on port 5000") # This line is used in the tester to signal readiness.
- joinThreads(threads)
Advertisement
Add Comment
Please, Sign In to add comment