tasyncawait.nim 1.4 KB

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