Advertisement
Guest User

Untitled

a guest
Apr 12th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.25 KB | None | 0 0
  1. import marshal
  2. import asyncnet
  3. import asyncdispatch
  4.  
  5. type
  6.   MessageType = enum
  7.     hostMsg,
  8.  
  9.   Message = object
  10.     case typ: MessageType
  11.       of hostMsg:
  12.         host: string
  13.         port: Port
  14.  
  15. var
  16.   peers {.threadVar.}: seq[AsyncSocket]
  17.   remoteChannel: Channel[Message]
  18.   thread: Thread[Port]
  19.  
  20. proc process(peer: AsyncSocket, remote: string) {.async.}
  21.  
  22. proc processHost(host: string, port: Port) {.async.} =
  23.   let sock  = newAsyncSocket()
  24.   await sock.connect(host, port)
  25.   asyncCheck sock.process(host)
  26.  
  27. proc process(peer: AsyncSocket, remote: string) {.async.} =
  28.   while true:
  29.     let str = await peer.recvLine()
  30.     if str == "": break
  31.  
  32.     let msg = to[Message](str)
  33.     case (to[Message](str)).typ:
  34.       of hostMsg:  asyncCheck processHost(msg.host, msg.port)
  35.  
  36. proc listenForPeers(port: Port) {.async.} =
  37.   let listener = newAsyncSocket()
  38.   listener.bindAddr(port)
  39.   listener.listen()
  40.  
  41.   while true:
  42.     let (host, peer) = await listener.acceptAddr()
  43.     asyncCheck peer.process(host)
  44.     peers.add(peer)
  45.  
  46. proc remoteThread(port: Port) {.thread.} =
  47.   peers = @[]
  48.   asyncCheck listenForPeers(port)
  49.   runForever()
  50.  
  51. proc startRemoteHandler*(port: Port) =
  52.   remoteChannel.open()
  53.   createThread(thread, remoteThread, port)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement