Guest User

yeea

a guest
Aug 6th, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.07 KB | None | 0 0
  1. #Problem: Errors with -d:release on, otherwise no problems.
  2. #Problem is on windows(haven't tested on others) that it closes without giving any warning. So it just crashes.
  3. #Nim version 0.11.2: compiled with --threads:on -d:release --checks:on
  4.  
  5. import asyncdispatch
  6. import rawsockets
  7. import threadpool
  8. import net
  9.  
  10. type
  11.     ChannelServerWorker = ref object
  12.         SockChan: TChannel[TAsyncFD]
  13.         S: Server
  14.  
  15.     Server = ref object
  16.         Workers: seq[ChannelServerWorker]
  17.         Sockets: seq[TAsyncFD]
  18.         Listener: Socket
  19.  
  20.  
  21. proc HandleSock(sock: TAsyncFD) {.async.}=
  22.     while true:
  23.         let data = await sock.recv(1023)
  24.         if data == "":
  25.             break
  26.         else:
  27.             echo(data)
  28.  
  29.     closeSocket(sock)
  30.     echo("sock closed!")
  31.  
  32. proc Idle() =
  33.     var sleepF = sleepAsync(100)
  34.     sleepF.callback = proc() =
  35.      Idle()
  36.    
  37. proc Run(csw: ChannelServerWorker) {.thread.} =
  38.     Idle()
  39.     while true:
  40.         let sockTuple = csw.SockChan.tryRecv()
  41.         if sockTuple.dataAvailable:
  42.             let sock = sockTuple.msg
  43.             register(sock)
  44.             asyncCheck sock.HandleSock()
  45.         else:
  46.             poll(1)
  47.  
  48. proc NewServer():Server =
  49.     var server = Server()
  50.     server.Workers = @[]
  51.     server.Sockets = @[]
  52.     server.Listener = newSocket()
  53.     return server
  54.  
  55. proc Run(server: Server, numCores:int=3) =
  56.     var threads = newSeq[TThread[ChannelServerWorker]](numCores)
  57.     #Start the threads:
  58.     for t in threads.mitems:
  59.         var csw = ChannelServerWorker()
  60.         csw.S = server
  61.         csw.SockChan.open()
  62.         server.Workers.add(csw)
  63.         t.createThread Run, csw
  64.  
  65.     server.Listener.bindAddr(Port(5555), "127.0.0.1")
  66.     server.Listener.listen()
  67.  
  68.     #Loop forever, accept new sock for every worker
  69.     while true:
  70.         for worker in server.Workers:
  71.           var client: Socket = Socket()
  72.           accept(server.Listener, client)
  73.           client.getFd().setBlocking(false)
  74.           worker.SockChan.send(client.getFd().TAsyncFD)
  75.      
  76.  
  77. var server = NewServer()
  78. server.Run(3)
Advertisement
Add Comment
Please, Sign In to add comment