From 73866a4c527cbdf726c5fd824526d5657d0e15ee Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期一, 15 六月 2020 19:47:13 +0800
Subject: [PATCH] update

---
 test/nng/pubsub.c      |    6 
 bipc/test_pubsub.sh    |    6 
 test/nanomsg/pubsub    |    0 
 bipc/bipc.h            |   38 +++
 test/nanomsg/pubsub.sh |    6 
 bipc/test_survey2      |    0 
 bipc/Makefile          |   33 +++
 bipc/bipc.c            |  132 +++++++++++++
 bipc/core              |    0 
 bipc/test_survey2.sh   |    6 
 bipc/test_survey       |    0 
 bipc/test_pubsub       |    0 
 /dev/null              |    0 
 test/Makefile          |    2 
 bipc/test_survey.sh    |    6 
 bipc/test_survey2.c    |  112 +++++++++++
 bipc/test_pubsub.c     |   84 ++++++++
 test/nng/pubsub.sh     |    6 
 bipc/test_survey.c     |   96 +++++++++
 test/nanomsg/pubsub.c  |   11 
 test/nng/pubsub        |    0 
 21 files changed, 536 insertions(+), 8 deletions(-)

diff --git a/bipc/Makefile b/bipc/Makefile
new file mode 100644
index 0000000..db7b85b
--- /dev/null
+++ b/bipc/Makefile
@@ -0,0 +1,33 @@
+#
+# Makefile for common library.
+#
+ROOT=..
+# LDLIBS+=-Wl,-rpath=
+# 娴峰悍鍖呰矾寰�
+# 寮�婧愬伐鍏峰寘璺緞
+LDDIR +=-L$(ROOT)/lib/nng
+ 
+# 寮�婧愬伐鍏峰寘
+LDLIBS += -lnng -lpthread
+
+#LIB_NETDISK = $(ROOT)/libnetdisk.a
+#DLIB_NETDISK = $(ROOT)/libnetdisk.so
+PLATFORM=$(shell $(ROOT)/systype.sh)
+include $(ROOT)/Make.defines.$(PLATFORM)
+
+ 
+PROGS = test_survey test_survey2 test_pubsub
+
+
+build: $(PROGS)
+
+
+test_survey: test_survey.c bipc.c
+ 
+test_pubsub:  test_pubsub.c bipc.c
+
+clean:
+	rm -f $(TEMPFILES) $(PROGS)
+
+
+include $(ROOT)/Make.common.inc
diff --git a/bipc/bipc.c b/bipc/bipc.c
new file mode 100644
index 0000000..a1918c7
--- /dev/null
+++ b/bipc/bipc.c
@@ -0,0 +1,132 @@
+#include "bipc.h"
+#include <nng/protocol/pipeline0/pull.h>
+#include <nng/protocol/pipeline0/push.h>
+#include <nng/protocol/survey0/survey.h>
+#include <nng/protocol/survey0/respond.h>
+#include <nng/protocol/pubsub0/pub.h>
+#include <nng/protocol/pubsub0/sub.h>
+#include <nng/protocol/pair0/pair.h>
+#include <nng/protocol/bus0/bus.h>
+#include <nng/protocol/reqrep0/rep.h>
+#include <nng/protocol/reqrep0/req.h>
+
+void
+static fatal(const char *func, int rv)
+{
+        fprintf(stderr, "%s: %s\n", func, nng_strerror(rv));
+        exit(1);
+}
+
+int  bipc_listen(bipc_socket_t *sock, const char *url, bipc_mod_t mod) {
+	 
+	int rv;
+	switch(mod) {
+		case PULL_PUSH:
+			rv = nng_pull0_open(sock);
+			 break;
+	    case PAIR:
+	    	rv = nng_pair0_open(sock);
+	        break;
+	    case BUS:
+	    	rv = nng_bus0_open(sock);
+	    	break;
+	    case REQ_REP:
+	    	rv = nng_rep0_open(sock);
+	    	break;
+	    case SURVEY:
+	    	rv = nng_surveyor0_open(sock);
+	    	break;
+	    case PUB_SUB:
+	    	rv = nng_pub0_open(sock);
+	    	break;
+	    default:
+	    	fprintf(stderr, "鏃犳硶璇嗗埆鐨勬ā寮�");
+	    	return -1;
+	}
+
+	if (rv != 0) {
+	   // fatal("open", rv);
+	    return rv;
+	}
+
+	if ((rv = nng_listen(*sock, url, NULL, 0)) != 0) {
+       // fatal("nng_listen", rv);
+        return rv;
+    }
+	return 0;
+
+}
+
+int bipc_connect(bipc_socket_t *sock, const char *url, bipc_mod_t mod) {
+	int rv  = 0 ;
+	switch(mod) {
+		case PULL_PUSH:
+			rv = nng_push0_open(sock);
+			break;
+	    case PAIR:
+	    	rv = nng_pair0_open(sock);
+	        break;
+	    case BUS:
+	    	break;
+	    case REQ_REP:
+	    	rv = nng_req0_open(sock);
+	    	break;
+	    case SURVEY:
+	    	rv = nng_respondent0_open(sock);
+	    	break;
+	    case PUB_SUB:
+	    	if ((rv = nng_sub0_open(sock)) != 0) {
+                //fatal("sub0_open", rv);
+                return rv;
+        	}
+	    	if ((rv = nng_setopt(*sock, NNG_OPT_SUB_SUBSCRIBE, "", 0)) != 0) {
+                //fatal("nng_setopt", rv);
+                return rv;
+        	}
+	    	break;
+	    default:
+	    	fprintf(stderr, "鏃犳硶璇嗗埆鐨勬ā寮�");
+	    	return rv;
+	}
+
+	if (rv != 0) {
+        fatal("bipc_connect open socket", rv);
+        return rv;
+    }
+
+	if ((rv = nng_dial(*sock, url, NULL, 0)) != 0) {
+       // fatal("dial", rv);
+        return rv;
+    }
+    return 0;
+}
+
+int bipc_send(bipc_socket_t *sock,  const void *data, size_t size) {
+    return nng_send(*sock, const_cast<void *>(data), size, 0);
+}
+
+
+int bipc_recv(nng_socket *sock,  void *data, size_t *sizep) {
+	
+	//int rv = nng_recv(*sock, data, sizep, 0);
+	// char *buf = NULL;
+	// int rv = nng_recv(*sock, &buf, sizep, NNG_FLAG_ALLOC);
+	// memcpy(data, buf, *sizep);
+	// nng_free(buf, *sizep);
+	int rv = nng_recv(*sock, data, sizep, NNG_FLAG_ALLOC);
+	if (rv == NNG_ETIMEDOUT)
+		return BIPC_ETIMEDOUT ;
+	
+	return rv;
+}
+
+
+void bipc_free(void *ptr, size_t size) {
+	 nng_free(ptr, size);
+}
+
+
+
+const char * bipc_strerror(int error) {
+	return nng_strerror(error);
+}
\ No newline at end of file
diff --git a/bipc/bipc.h b/bipc/bipc.h
new file mode 100644
index 0000000..9dcdc7b
--- /dev/null
+++ b/bipc/bipc.h
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <nng/nng.h>
+
+
+enum bipc_mod_t
+{
+	PULL_PUSH = 1,
+	REQ_REP = 2,
+	PAIR = 3,
+	PUB_SUB = 4,
+	SURVEY = 5,
+	BUS = 6
+	
+};
+
+enum bipc_err {
+	BIPC_ETIMEDOUT = 5
+};
+
+
+typedef nng_socket bipc_socket_t;
+
+int bipc_listen(bipc_socket_t *sock, const char *url, bipc_mod_t mod);
+
+int bipc_connect(bipc_socket_t *sock, const char *url, bipc_mod_t mod);
+
+int bipc_send(bipc_socket_t *sock,  const void *data, size_t size);
+
+int bipc_recv(nng_socket *sock,  void *data, size_t *sizep);
+
+void bipc_free(void *ptr, size_t size) ;
+
+const char * bipc_strerror(int error);
\ No newline at end of file
diff --git a/bipc/core b/bipc/core
new file mode 100644
index 0000000..4042d75
--- /dev/null
+++ b/bipc/core
Binary files differ
diff --git a/bipc/test_pubsub b/bipc/test_pubsub
new file mode 100755
index 0000000..eab45e6
--- /dev/null
+++ b/bipc/test_pubsub
Binary files differ
diff --git a/bipc/test_pubsub.c b/bipc/test_pubsub.c
new file mode 100644
index 0000000..4f57719
--- /dev/null
+++ b/bipc/test_pubsub.c
@@ -0,0 +1,84 @@
+#include "bipc.h"
+
+#define SERVER "server"
+#define CLIENT "client"
+
+void
+fatal(const char *func, int rv)
+{
+        fprintf(stderr, "%s: %s\n", func, bipc_strerror(rv));
+}
+
+char *
+date(void)
+{
+        time_t now = time(&now);
+        struct tm *info = localtime(&now);
+        char *text = asctime(info);
+        text[strlen(text)-1] = '\0'; // remove '\n'
+        return (text);
+}
+
+int
+server(const char *url)
+{
+        bipc_socket_t sock;
+        int rv;
+
+        // if ((rv = nng_pub0_open(&sock)) != 0) {
+        //         fatal("nng_pub0_open", rv);
+        // }
+        if ((rv = bipc_listen(&sock, url, PUB_SUB)) < 0) {
+                fatal("nng_listen", rv);
+        }
+        for (;;) {
+                char *d = date();
+                printf("SERVER: PUBLISHING DATE %s\n", d);
+                if ((rv = bipc_send(&sock, d, strlen(d) + 1)) != 0) {
+                        fatal("nng_send", rv);
+                }
+                sleep(1);
+        }
+}
+
+int
+client(const char *url, const char *name)
+{
+        bipc_socket_t sock;
+        int rv;
+
+        // if ((rv = nng_sub0_open(&sock)) != 0) {
+        //         fatal("nng_sub0_open", rv);
+        // }
+
+        // // subscribe to everything (empty means all topics)
+        // if ((rv = nng_setopt(sock, NNG_OPT_SUB_SUBSCRIBE, "", 0)) != 0) {
+        //         fatal("nng_setopt", rv);
+        // }
+        if ((rv = bipc_connect(&sock, url, PUB_SUB)) != 0) {
+                fatal("nng_dial", rv);
+        }
+        for (;;) {
+                char *buf = NULL;
+                size_t sz;
+                if ((rv = bipc_recv(&sock, &buf, &sz)) != 0) {
+                        fatal("nng_recv", rv);
+                }
+                printf("CLIENT (%s): RECEIVED %s\n", name, buf); 
+                bipc_free(buf, sz);
+        }
+}
+
+int
+main(const int argc, const char **argv)
+{
+        if ((argc >= 2) && (strcmp(SERVER, argv[1]) == 0))
+                return (server(argv[2]));
+
+          if ((argc >= 3) && (strcmp(CLIENT, argv[1]) == 0))
+                return (client (argv[2], argv[3]));
+
+        fprintf(stderr, "Usage: pubsub %s|%s <URL> <ARG> ...\n",
+            SERVER, CLIENT);
+        return 1;
+}
\ No newline at end of file
diff --git a/bipc/test_pubsub.sh b/bipc/test_pubsub.sh
new file mode 100644
index 0000000..ab8134c
--- /dev/null
+++ b/bipc/test_pubsub.sh
@@ -0,0 +1,6 @@
+./test_pubsub server ipc:///tmp/test_pubsub.ipc & server=$! && sleep 1
+./test_pubsub client ipc:///tmp/test_pubsub.ipc client0 & client0=$!
+./test_pubsub client ipc:///tmp/test_pubsub.ipc client1 & client1=$!
+./test_pubsub client ipc:///tmp/test_pubsub.ipc client2 & client2=$!
+sleep 5
+kill $server $client0 $client1 $client2
\ No newline at end of file
diff --git a/bipc/test_survey b/bipc/test_survey
new file mode 100755
index 0000000..d577d43
--- /dev/null
+++ b/bipc/test_survey
Binary files differ
diff --git a/bipc/test_survey.c b/bipc/test_survey.c
new file mode 100644
index 0000000..40d6ad0
--- /dev/null
+++ b/bipc/test_survey.c
@@ -0,0 +1,96 @@
+#include "bipc.h"
+
+#define SERVER "server"
+#define CLIENT "client"
+#define DATE   "DATE"
+
+
+
+void
+fatal(const char *func, int rv)
+{
+        fprintf(stderr, "%s: %s\n", func, bipc_strerror(rv));
+        exit(1);
+}
+
+char *
+date(void)
+{
+        time_t now = time(&now);
+        struct tm *info = localtime(&now);
+        char *text = asctime(info);
+        text[strlen(text)-1] = '\0'; // remove '\n'
+        return (text);
+}
+
+int
+server(const char *url)
+{
+        bipc_socket_t sock;
+        int rv;
+
+        
+        if ((rv = bipc_listen(&sock, url, SURVEY)) != 0) {
+            fatal("nng_listen", rv);
+        }
+        for (;;) {
+            printf("SERVER: SENDING DATE SURVEY REQUEST\n");
+            if ((rv = bipc_send(&sock, DATE, strlen(DATE) + 1)) != 0) {
+                fatal("nng_send", rv);
+            }
+
+            for (;;) {
+                char *buf = NULL;
+                size_t sz;
+                rv = bipc_recv(&sock, &buf, &sz);
+                if (rv == BIPC_ETIMEDOUT) {
+                    break;
+                }
+                if (rv != 0) {
+                    fatal("nng_recv", rv);
+                }
+                printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", buf);
+                bipc_free(buf, sz);
+            }
+
+            printf("SERVER: SURVEY COMPLETE\n");
+        }
+}
+
+int
+client(const char *url, const char *name)
+{
+        bipc_socket_t sock;
+        int rv;
+         
+        if ((rv = bipc_connect(&sock, url, SURVEY)) != 0) {
+            fatal("nng_dial", rv);
+        }
+        for (;;) {
+            char *buf = NULL;
+            size_t sz;
+            if ((rv = bipc_recv(&sock, &buf, &sz)) == 0) {
+                printf("CLIENT (%s): RECEIVED \"%s\" SURVEY REQUEST, length=%d\n", name, buf, sz);
+                bipc_free(buf, sz);
+                char *d = date();
+                printf("CLIENT (%s): SENDING DATE SURVEY RESPONSE\n", name);
+                if ((rv = bipc_send(&sock, d, strlen(d) + 1)) != 0) {
+                    fatal("nng_send", rv);
+                }
+            }
+        }
+}
+
+int
+main(const int argc, const char **argv)
+{
+    if ((argc >= 2) && (strcmp(SERVER, argv[1]) == 0))
+        return (server(argv[2]));
+
+    if ((argc >= 3) && (strcmp(CLIENT, argv[1]) == 0))
+        return (client(argv[2], argv[3]));
+
+    fprintf(stderr, "Usage: survey %s|%s <URL> <ARG> ...\n",
+        SERVER, CLIENT);
+    return 1;
+}
\ No newline at end of file
diff --git a/bipc/test_survey.sh b/bipc/test_survey.sh
new file mode 100755
index 0000000..58358c4
--- /dev/null
+++ b/bipc/test_survey.sh
@@ -0,0 +1,6 @@
+./test_survey server ipc:///tmp/test_survey.ipc & server=$!
+./test_survey client ipc:///tmp/test_survey.ipc client0 & client0=$!
+./test_survey client ipc:///tmp/test_survey.ipc client1 & client1=$!
+./test_survey client ipc:///tmp/test_survey.ipc client2 & client2=$!
+sleep 3 
+kill $server $client0 $client1 $client2
\ No newline at end of file
diff --git a/bipc/test_survey2 b/bipc/test_survey2
new file mode 100755
index 0000000..b5439a7
--- /dev/null
+++ b/bipc/test_survey2
Binary files differ
diff --git a/bipc/test_survey2.c b/bipc/test_survey2.c
new file mode 100644
index 0000000..7c142a2
--- /dev/null
+++ b/bipc/test_survey2.c
@@ -0,0 +1,112 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <nng/nng.h>
+#include <nng/protocol/survey0/survey.h>
+#include <nng/protocol/survey0/respond.h>
+
+#define SERVER "server"
+#define CLIENT "client"
+char * DATE  = "DATE";
+
+void
+fatal(const char *func, int rv)
+{
+        fprintf(stderr, "%s: %s\n", func, nng_strerror(rv));
+        exit(1);
+}
+
+char *
+date(void)
+{
+        time_t now = time(&now);
+        struct tm *info = localtime(&now);
+        char *text = asctime(info);
+        text[strlen(text)-1] = '\0'; // remove '\n'
+        return (text);
+}
+
+int
+server(const char *url)
+{
+        nng_socket sock;
+        int rv;
+
+        if ((rv = nng_surveyor0_open(&sock)) != 0) {
+                fatal("nng_surveyor0_open", rv);
+        }
+        if ((rv = nng_listen(sock, url, NULL, 0)) != 0) {
+                fatal("nng_listen", rv);
+        }
+        for (;;) {
+                printf("SERVER: SENDING DATE SURVEY REQUEST\n");
+                if ((rv = nng_send(sock, DATE, strlen(DATE) + 1, 0)) != 0) {
+                        fatal("nng_send", rv);
+                }
+
+                for (;;) {
+                        char *buf = NULL;
+                        size_t sz;
+                        rv = nng_recv(sock, &buf, &sz, NNG_FLAG_ALLOC);
+                        if (rv == NNG_ETIMEDOUT) {
+                                break;
+                        }
+                        if (rv != 0) {
+                                fatal("nng_recv", rv);
+                        }
+                        printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n",
+                            buf); 
+                        nng_free(buf, sz);
+                }
+
+                printf("SERVER: SURVEY COMPLETE\n");
+        }
+}
+
+int
+client(const char *url, const char *name)
+{
+        nng_socket sock;
+        int rv;
+
+        if ((rv = nng_respondent0_open(&sock)) != 0) {
+                fatal("nng_respondent0_open", rv);
+        }
+        if ((rv = nng_dial(sock, url, NULL, NNG_FLAG_NONBLOCK)) != 0) {
+                fatal("nng_dial", rv);
+        }
+        for (;;) {
+                char *buf = NULL;
+                //char buf[1024];
+                size_t sz;
+                if ((rv = nng_recv(sock, &buf, &sz, NNG_FLAG_ALLOC)) == 0) {
+               // if ((rv = nng_recv(sock, buf, &sz, 0)) == 0) {
+                        printf("CLIENT (%s): RECEIVED \"%s\" SURVEY REQUEST\n",
+                            name, buf); 
+                       // nng_free(buf, sz);
+                        char *d = date();
+                        printf("CLIENT (%s): SENDING DATE SURVEY RESPONSE\n",
+                           name);
+                        if ((rv = nng_send(sock, d, strlen(d) + 1, 0)) != 0) {
+                                fatal("nng_send", rv);
+                        }
+                }
+        }
+}
+
+int
+main(const int argc, const char **argv)
+{
+        if ((argc >= 2) && (strcmp(SERVER, argv[1]) == 0))
+                return (server(argv[2]));
+
+        if ((argc >= 3) && (strcmp(CLIENT, argv[1]) == 0))
+                return (client(argv[2], argv[3]));
+
+        fprintf(stderr, "Usage: survey %s|%s <URL> <ARG> ...\n",
+            SERVER, CLIENT);
+        return 1;
+}
\ No newline at end of file
diff --git a/bipc/test_survey2.sh b/bipc/test_survey2.sh
new file mode 100755
index 0000000..618d19f
--- /dev/null
+++ b/bipc/test_survey2.sh
@@ -0,0 +1,6 @@
+./test_survey2 server ipc:///tmp/test_survey2.ipc & server=$!
+./test_survey2 client ipc:///tmp/test_survey2.ipc client0 & client0=$!
+./test_survey2 client ipc:///tmp/test_survey2.ipc client1 & client1=$!
+./test_survey2 client ipc:///tmp/test_survey2.ipc client2 & client2=$!
+sleep 3 
+kill $server $client0 $client1 $client2
\ No newline at end of file
diff --git a/test/Makefile b/test/Makefile
index a002692..7dafde0 100755
--- a/test/Makefile
+++ b/test/Makefile
@@ -25,7 +25,7 @@
 
 
 clean:
-	rm $(TEMPFILES)
+	rm -f $(TEMPFILES)
 
 
 include $(ROOT)/Make.common.inc
diff --git a/test/core b/test/core
deleted file mode 100644
index fe39cd2..0000000
--- a/test/core
+++ /dev/null
Binary files differ
diff --git a/test/nanomsg/pubsub b/test/nanomsg/pubsub
index 11b7616..8b10b19 100755
--- a/test/nanomsg/pubsub
+++ b/test/nanomsg/pubsub
Binary files differ
diff --git a/test/nanomsg/pubsub.c b/test/nanomsg/pubsub.c
index a8f2702..048d221 100644
--- a/test/nanomsg/pubsub.c
+++ b/test/nanomsg/pubsub.c
@@ -6,6 +6,7 @@
 
 #include <nanomsg/nn.h>
 #include <nanomsg/pubsub.h>
+#include <nanomsg/reqrep.h>
 
 #define SERVER "server"
 #define CLIENT "client"
@@ -31,7 +32,7 @@
 {
         int sock;
 
-        if ((sock = nn_socket(AF_SP, NN_PUB)) < 0) {
+        if ((sock = nn_socket(AF_SP, NN_REQ )) < 0) {
                 fatal("nn_socket");
         }
           if (nn_bind(sock, url) < 0) {
@@ -54,14 +55,14 @@
 {
         int sock;
 
-        if ((sock = nn_socket(AF_SP, NN_SUB)) < 0) {
+        if ((sock = nn_socket(AF_SP, NN_REP)) < 0) {
                 fatal("nn_socket");
         }
 
         // subscribe to everything ("" means all topics)
-        if (nn_setsockopt(sock, NN_SUB, NN_SUB_SUBSCRIBE, "", 0) < 0) {
-                fatal("nn_setsockopt");
-        }
+        // if (nn_setsockopt(sock, NN_SUB, NN_SUB_SUBSCRIBE, "sjhdfjsdfh", 0) < 0) {
+        //         fatal("nn_setsockopt");
+        // }
         if (nn_connect(sock, url) < 0) {
                 fatal("nn_connet");
         }
diff --git a/test/nanomsg/pubsub.sh b/test/nanomsg/pubsub.sh
new file mode 100755
index 0000000..c3f1c59
--- /dev/null
+++ b/test/nanomsg/pubsub.sh
@@ -0,0 +1,6 @@
+./pubsub server ipc:///tmp/pubsub.ipc & server=$! && sleep 1
+./pubsub client ipc:///tmp/pubsub.ipc client0 & client0=$!
+./pubsub client ipc:///tmp/pubsub.ipc client1 & client1=$!
+./pubsub client ipc:///tmp/pubsub.ipc client2 & client2=$!
+sleep 5
+kill $server $client0 $client1 $client2
diff --git a/test/nng/pubsub b/test/nng/pubsub
new file mode 100755
index 0000000..76667af
--- /dev/null
+++ b/test/nng/pubsub
Binary files differ
diff --git a/test/nng/pubsub.c b/test/nng/pubsub.c
index 794cd6c..c45476b 100644
--- a/test/nng/pubsub.c
+++ b/test/nng/pubsub.c
@@ -32,6 +32,7 @@
 {
         nng_socket sock;
         int rv;
+        char buf[1024];
 
         if ((rv = nng_pub0_open(&sock)) != 0) {
                 fatal("nng_pub0_open", rv);
@@ -41,8 +42,9 @@
         }
         for (;;) {
                 char *d = date();
+                snprintf(buf, 1024, "time:%s", d);
                 printf("SERVER: PUBLISHING DATE %s\n", d);
-                if ((rv = nng_send(sock, d, strlen(d) + 1, 0)) != 0) {
+                if ((rv = nng_send(sock, buf, strlen(buf) + 1, 0)) != 0) {
                         fatal("nng_send", rv);
                 }
                 sleep(1);
@@ -60,7 +62,7 @@
         }
 
         // subscribe to everything (empty means all topics)
-        if ((rv = nng_setopt(sock, NNG_OPT_SUB_SUBSCRIBE, "", 0)) != 0) {
+        if ((rv = nng_setopt(sock, NNG_OPT_SUB_SUBSCRIBE, "nnnnnnnnn", 0)) != 0) {
                 fatal("nng_setopt", rv);
         }
         if ((rv = nng_dial(sock, url, NULL, 0)) != 0) {
diff --git a/test/nng/pubsub.sh b/test/nng/pubsub.sh
new file mode 100755
index 0000000..569d384
--- /dev/null
+++ b/test/nng/pubsub.sh
@@ -0,0 +1,6 @@
+./pubsub server ipc:///tmp/pubsub.ipc & server=$! && sleep 1
+./pubsub client ipc:///tmp/pubsub.ipc client0 & client0=$!
+./pubsub client ipc:///tmp/pubsub.ipc client1 & client1=$!
+./pubsub client ipc:///tmp/pubsub.ipc client2 & client2=$!
+sleep 5
+kill $server $client0 $client1 $client2
\ No newline at end of file

--
Gitblit v1.8.0