tasyncawait.nim 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. discard """
  2. file: "tasyncawait.nim"
  3. output: "5000"
  4. """
  5. import asyncdispatch, nativesockets, net, strutils, os
  6. var msgCount = 0
  7. const
  8. swarmSize = 50
  9. messagesToSend = 100
  10. var clientCount = 0
  11. proc sendMessages(client: AsyncFD) {.async.} =
  12. for i in 0 .. <messagesToSend:
  13. await send(client, "Message " & $i & "\c\L")
  14. proc launchSwarm(port: Port) {.async.} =
  15. for i in 0 .. <swarmSize:
  16. var sock = newAsyncNativeSocket()
  17. await connect(sock, "localhost", port)
  18. await sendMessages(sock)
  19. closeSocket(sock)
  20. proc readMessages(client: AsyncFD) {.async.} =
  21. while true:
  22. var line = await recvLine(client)
  23. if line == "":
  24. closeSocket(client)
  25. clientCount.inc
  26. break
  27. else:
  28. if line.startswith("Message "):
  29. msgCount.inc
  30. else:
  31. doAssert false
  32. proc createServer(port: Port) {.async.} =
  33. var server = newAsyncNativeSocket()
  34. block:
  35. var name: Sockaddr_in
  36. name.sin_family = toInt(AF_INET).uint16
  37. name.sin_port = htons(uint16(port))
  38. name.sin_addr.s_addr = htonl(INADDR_ANY)
  39. if bindAddr(server.SocketHandle, cast[ptr SockAddr](addr(name)),
  40. sizeof(name).Socklen) < 0'i32:
  41. raiseOSError(osLastError())
  42. discard server.SocketHandle.listen()
  43. while true:
  44. asyncCheck readMessages(await accept(server))
  45. asyncCheck createServer(Port(10335))
  46. asyncCheck launchSwarm(Port(10335))
  47. while true:
  48. poll()
  49. if clientCount == swarmSize: break
  50. assert msgCount == swarmSize * messagesToSend
  51. echo msgCount