mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
90 lines
2.0 KiB
Nim
90 lines
2.0 KiB
Nim
# It is a reproduction of the 'tnewasyncudp' test code, but using a high level
|
|
# of asynchronous procedures. Output: "5000"
|
|
import asyncdispatch, asyncnet, nativesockets, net, strutils
|
|
|
|
var msgCount = 0
|
|
var recvCount = 0
|
|
|
|
const
|
|
messagesToSend = 100
|
|
swarmSize = 50
|
|
serverPort = 10333
|
|
|
|
var
|
|
sendports = 0
|
|
recvports = 0
|
|
|
|
proc saveSendingPort(port: Port) =
|
|
sendports = sendports + int(port)
|
|
|
|
proc saveReceivedPort(port: Port) =
|
|
recvports = recvports + int(port)
|
|
|
|
proc launchSwarm(serverIp: string, serverPort: Port) {.async.} =
|
|
var i = 0
|
|
|
|
while i < swarmSize:
|
|
var sock = newAsyncSocket(nativesockets.AF_INET, nativesockets.SOCK_DGRAM,
|
|
Protocol.IPPROTO_UDP, false)
|
|
|
|
bindAddr(sock, address = "127.0.0.1")
|
|
|
|
let (null, localPort) = getLocalAddr(sock)
|
|
|
|
var k = 0
|
|
|
|
while k < messagesToSend:
|
|
let message = "Message " & $(i * messagesToSend + k)
|
|
|
|
await asyncnet.sendTo(sock, serverIp, serverPort, message)
|
|
|
|
let (data, fromIp, fromPort) = await recvFrom(sock, 16384)
|
|
|
|
if data == message:
|
|
saveSendingPort(localPort)
|
|
|
|
inc(recvCount)
|
|
|
|
inc(k)
|
|
|
|
close(sock)
|
|
|
|
inc(i)
|
|
|
|
proc readMessages(server: AsyncSocket) {.async.} =
|
|
let maxResponses = (swarmSize * messagesToSend)
|
|
|
|
var i = 0
|
|
|
|
while i < maxResponses:
|
|
let (data, fromIp, fromPort) = await recvFrom(server, 16384)
|
|
|
|
if data.startsWith("Message ") and fromIp == "127.0.0.1":
|
|
await sendTo(server, fromIp, fromPort, data)
|
|
|
|
inc(msgCount)
|
|
|
|
saveReceivedPort(fromPort)
|
|
|
|
inc(i)
|
|
|
|
proc createServer() {.async.} =
|
|
var server = newAsyncSocket(nativesockets.AF_INET, nativesockets.SOCK_DGRAM, Protocol.IPPROTO_UDP, false)
|
|
|
|
bindAddr(server, Port(serverPort), "127.0.0.1")
|
|
|
|
asyncCheck readMessages(server)
|
|
|
|
asyncCheck createServer()
|
|
asyncCheck launchSwarm("127.0.0.1", Port(serverPort))
|
|
|
|
while true:
|
|
poll()
|
|
|
|
if recvCount == swarmSize * messagesToSend:
|
|
break
|
|
|
|
doAssert msgCount == swarmSize * messagesToSend
|
|
doAssert sendports == recvports
|
|
|
|
echo msgCount |