mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 12:07:51 +00:00
93 lines
2.2 KiB
Nim
93 lines
2.2 KiB
Nim
discard """
|
|
file: "tasynciossl.nim"
|
|
cmd: "nim $target --hints:on --define:ssl $options $file"
|
|
output: "20000"
|
|
"""
|
|
import sockets, asyncio, strutils, times
|
|
|
|
var disp {.threadvar.}: PDispatcher
|
|
disp = newDispatcher()
|
|
var msgCount = 0
|
|
|
|
when defined(ssl):
|
|
var ctx = newContext(verifyMode = CVerifyNone,
|
|
certFile = "tests/testdata/mycert.pem", keyFile = "tests/testdata/mycert.pem")
|
|
|
|
var ctx1 = newContext(verifyMode = CVerifyNone)
|
|
|
|
const
|
|
swarmSize = 50
|
|
messagesToSend = 100
|
|
|
|
proc swarmConnect(s: PAsyncSocket) =
|
|
#echo("Connected")
|
|
for i in 1..messagesToSend:
|
|
s.send("Message " & $i & "\c\L")
|
|
s.close()
|
|
|
|
proc serverRead(s: PAsyncSocket) =
|
|
var line = ""
|
|
assert s.readLine(line)
|
|
if line != "":
|
|
#echo(line)
|
|
if line.startsWith("Message "):
|
|
msgCount.inc()
|
|
else:
|
|
assert(false)
|
|
else:
|
|
s.close()
|
|
|
|
proc serverAccept(s: PAsyncSocket) =
|
|
var client: PAsyncSocket
|
|
new(client)
|
|
s.accept(client)
|
|
client.handleRead = serverRead
|
|
disp.register(client)
|
|
|
|
proc launchSwarm(disp: var PDispatcher, port: TPort, count: int,
|
|
buffered = true, useSSL = false) =
|
|
for i in 1..count:
|
|
var client = asyncSocket()
|
|
when defined(ssl):
|
|
if useSSL:
|
|
ctx1.wrapSocket(client)
|
|
client.handleConnect = swarmConnect
|
|
disp.register(client)
|
|
client.connect("localhost", port)
|
|
|
|
proc createSwarm(port: TPort, buffered = true, useSSL = false) =
|
|
var server = asyncSocket()
|
|
when defined(ssl):
|
|
if useSSL:
|
|
ctx.wrapSocket(server)
|
|
server.handleAccept = serverAccept
|
|
disp.register(server)
|
|
server.bindAddr(port)
|
|
server.listen()
|
|
disp.launchSwarm(port, swarmSize, buffered, useSSL)
|
|
|
|
when defined(ssl):
|
|
const serverCount = 4
|
|
else:
|
|
const serverCount = 2
|
|
|
|
createSwarm(TPort(10235))
|
|
createSwarm(TPort(10236), false)
|
|
|
|
when defined(ssl):
|
|
createSwarm(TPort(10237), true, true)
|
|
createSwarm(TPort(10238), false, true)
|
|
|
|
var startTime = epochTime()
|
|
while true:
|
|
if epochTime() - startTime >= 300.0:
|
|
break
|
|
if not disp.poll(): break
|
|
if disp.len == serverCount:
|
|
# Only the servers are left in the dispatcher. All clients finished,
|
|
# we need to therefore break.
|
|
break
|
|
|
|
assert msgCount == (swarmSize * messagesToSend) * serverCount
|
|
echo(msgCount)
|