Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import marshal
- import asyncnet
- import asyncdispatch
- type
- MessageType = enum
- hostMsg,
- Message = object
- case typ: MessageType
- of hostMsg:
- host: string
- port: Port
- var
- peers {.threadVar.}: seq[AsyncSocket]
- remoteChannel: Channel[Message]
- thread: Thread[Port]
- proc process(peer: AsyncSocket, remote: string) {.async.}
- proc processHost(host: string, port: Port) {.async.} =
- let sock = newAsyncSocket()
- await sock.connect(host, port)
- asyncCheck sock.process(host)
- proc process(peer: AsyncSocket, remote: string) {.async.} =
- while true:
- let str = await peer.recvLine()
- if str == "": break
- let msg = to[Message](str)
- case (to[Message](str)).typ:
- of hostMsg: asyncCheck processHost(msg.host, msg.port)
- proc listenForPeers(port: Port) {.async.} =
- let listener = newAsyncSocket()
- listener.bindAddr(port)
- listener.listen()
- while true:
- let (host, peer) = await listener.acceptAddr()
- asyncCheck peer.process(host)
- peers.add(peer)
- proc remoteThread(port: Port) {.thread.} =
- peers = @[]
- asyncCheck listenForPeers(port)
- runForever()
- proc startRemoteHandler*(port: Port) =
- remoteChannel.open()
- createThread(thread, remoteThread, port)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement