Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Problem: Errors with -d:release on, otherwise no problems.
- #Problem is on windows(haven't tested on others) that it closes without giving any warning. So it just crashes.
- #Nim version 0.11.2
- import asyncdispatch
- import rawsockets
- import threadpool
- import net
- type
- ChannelServerWorker = ref object
- SockChan: TChannel[TAsyncFD]
- S: Server
- Server = ref object
- Workers: seq[ChannelServerWorker]
- Sockets: seq[TAsyncFD]
- Listener: Socket
- proc Idle(csw: ChannelServerWorker) {.async.} =
- while true:
- await sleepAsync(100)
- proc HandleSock(sock: TAsyncFD) {.async.} =
- while true:
- let data = await sock.recv(1023)
- if data != "":
- echo(data)
- else:
- break
- closeSocket(sock)
- proc Run(csw: ChannelServerWorker) =
- csw.SockChan.open()
- asyncCheck csw.Idle()
- while true:
- let sockTuple = csw.SockChan.tryRecv()
- if sockTuple.dataAvailable:
- let sock = sockTuple.msg
- register(sock)
- asyncCheck sock.HandleSock()
- else:
- poll(1)
- proc NewServer():Server =
- var server = Server()
- server.Workers = @[]
- server.Sockets = @[]
- server.Listener = newSocket()
- return server
- proc Run(server: Server, numCores:int=3) =
- var threads = newSeq[TThread[ChannelServerWorker]](numCores)
- #Start the threads:
- for t in threads.mitems:
- var csw = ChannelServerWorker()
- csw.S = server
- server.Workers.add(csw)
- t.createThread Run, csw
- server.Listener.bindAddr(Port(5587), "127.0.0.1")
- server.Listener.listen()
- #Loop forever, accept new sock for every worker
- while true:
- for worker in server.Workers:
- var client: Socket = Socket()
- accept(server.Listener, client)
- client.getFd().setBlocking(false)
- worker.SockChan.send(client.getFd().TAsyncFD)
- var server = NewServer()
- server.Run(3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement