aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Carcich <briantcarcich@gmail.com>2024-02-07 17:32:33 -0500
committerGarrett D'Amore <garrett@damore.org>2024-12-31 00:36:01 -0800
commit292e0a68516f1d5833e4bef582457113a939a9ef (patch)
tree171ac1e43308cfaaddd5e0d0fbd8c934cc6a1925
parent979d88e8d09f5db265f0f677f66efbef7a346a0e (diff)
downloadnng-292e0a68516f1d5833e4bef582457113a939a9ef.tar.gz
nng-292e0a68516f1d5833e4bef582457113a939a9ef.tar.bz2
nng-292e0a68516f1d5833e4bef582457113a939a9ef.zip
Enhance demo/async/ to allow async dial by client
demo/async/client.c - Enable client, on dial, to wait for server that has not yet started demo/async/arun.sh - Run async demo with arbitrary start order of server wrt clients
-rwxr-xr-xdemo/async/arun.sh59
-rw-r--r--demo/async/client.c3
2 files changed, 61 insertions, 1 deletions
diff --git a/demo/async/arun.sh b/demo/async/arun.sh
new file mode 100755
index 00000000..ca6c0cf5
--- /dev/null
+++ b/demo/async/arun.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+########################################################################
+### Start asynchronous clients that can
+### wait for asynchronous server to start
+########################################################################
+
+### Usage: ./arun.sh [client#]
+### - client# => do not start server until just before this client
+
+### Socket file; client count
+ADDR=ipc:///tmp/async_demo
+COUNT=10
+
+### Client # to match when server should be started; clear server PID
+SERVER_ORDINAL=$1
+unset SERVER_PID
+
+### Create CLIENT_PID as an array
+typeset -a CLIENT_PID
+i=0
+while (( i < COUNT ))
+do
+ i=$(( i + 1 ))
+
+ ### Start server before the matching client
+ if [ "$SERVER_ORDINAL" == "$i" ] ; then
+ ./server $ADDR &
+ SERVER_PID=$!
+ echo Started server before client $i
+ trap "kill $SERVER_PID" 0
+ fi
+
+ ### Start start client with NONBLOCK envvar set
+ ### so client will wait for socket to be open on nng_dial
+ rnd=$(( RANDOM % 1000 + 500 ))
+ echo "Starting client $i: server will reply after $rnd msec"
+ NONBLOCK= ./client $ADDR $rnd &
+ ### Add this client's PID to client PID array
+ eval CLIENT_PID[$i]=$!
+done
+
+### Start server if not yet started
+[ "$SERVER_PID" ] || \
+{
+ ./server $ADDR &
+ SERVER_PID=$!
+ echo Starting server after last client - SERVER_PID=$SERVER_PID
+ trap "kill $SERVER_PID" 0
+}
+
+### Wait for clients to complete
+i=0
+while (( i < COUNT ))
+do
+ i=$(( i + 1 ))
+ wait ${CLIENT_PID[$i]}
+done
+### Kill server
+kill $SERVER_PID
diff --git a/demo/async/client.c b/demo/async/client.c
index 90fce164..33ab9b36 100644
--- a/demo/async/client.c
+++ b/demo/async/client.c
@@ -53,7 +53,8 @@ client(const char *url, const char *msecstr)
fatal("nng_req0_open", rv);
}
- if ((rv = nng_dial(sock, url, NULL, 0)) != 0) {
+ if ((rv = nng_dial(sock, url, NULL,
+ getenv("NONBLOCK") ? NNG_FLAG_NONBLOCK : 0)) != 0) {
fatal("nng_dial", rv);
}