Hello the nanomsg mailing list I wanted to try to mix two sort of configuration in a same example The first is survey the second is pub/sub on two distinct socket using poll to deal with the different kind of sockects As following code #include <assert.h> //#include <libc.h> #include <string.h> #include <stdio.h> #include <time.h> #define _GNU_SOURCE #include <netdb.h> #include <string.h> #include <nanomsg/nn.h> #include <nanomsg/survey.h> #include <nanomsg/pubsub.h> #define SERVER "server" #define CLIENT "client" #define DATE "DATE" char *date () { time_t raw = time (&raw); struct tm *info = localtime (&raw); char *text = asctime (info); text[(int)(strlen(text)-1)] = '\0'; // remove '\n' return text; } int server (const char *url) { int sock = nn_socket (AF_SP, NN_SURVEYOR); assert (sock >= 0); assert (nn_bind (sock, url) >= 0); int sock2 = nn_socket (AF_SP, NN_PUB); assert (sock2 >= 0); assert (nn_bind (sock2, url) >= 0); sleep(1); // wait for connections struct nn_pollfd pfd [2]; pfd [0].fd = sock; pfd [0].events = NN_POLLIN | NN_POLLOUT; pfd [1].fd = sock2; pfd [1].events = NN_POLLOUT; while (1) { int rc = nn_poll (pfd, 2, 2000); if (rc == 0) { printf ("SERVER: Timeout!\n"); } else if (rc == -1) { printf ("SERVER : Error (%s)!\n",strerror(errno)); } if (pfd [0].revents & NN_POLLOUT) { int sz_d = strlen(DATE) + 1; // '\0' too printf ("SERVER: SENDING DATE SURVEY REQUEST\n"); int bytes = nn_send (sock, DATE, sz_d, 0); assert (bytes == sz_d); } if (pfd [0].revents & NN_POLLIN) { char *buf = NULL; int bytes = nn_recv (sock, &buf, NN_MSG, 0); if (bytes == ETIMEDOUT) break; if (bytes >= 0) { printf ("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", buf); nn_freemsg (buf); } } if (pfd [1].revents & NN_POLLOUT) { char *d = "HELLO from P3k"; int sz_d = strlen(d) + 1; // '\0' too printf ("SERVER: PUBLISHING MSG %s\n", d); int bytes2 = nn_send (sock2, d, sz_d, 0); assert (bytes2 == sz_d); } sleep(1); } nn_shutdown (sock, 0); nn_shutdown (sock2, 0); return 0; } int client (const char *url, const char *name) { int sock = nn_socket (AF_SP, NN_RESPONDENT); assert (sock >= 0); assert (nn_connect (sock, url) >= 0); int sock2 = nn_socket (AF_SP, NN_SUB); assert (sock2 >= 0); // TODO learn more about publishing/subscribe keys assert (nn_setsockopt (sock2, NN_SUB, NN_SUB_SUBSCRIBE, "", 0) >= 0); assert (nn_connect (sock2, url) >= 0); struct nn_pollfd pfd [2]; pfd [0].fd = sock; pfd [0].events = NN_POLLIN; pfd [1].fd = sock2; pfd [1].events = NN_POLLIN; while (1) { int rc = nn_poll (pfd, 2, 2000); if (rc == 0) { printf ("CLIENT (%s): Timeout!\n",name); } else if (rc == -1) { printf ("CLIENT (%s): Error (%s)!\n",name,strerror(errno)); } if (pfd [0].revents & NN_POLLIN) { printf ("Message can be received from s1!\n"); char *buf = NULL; int bytes = nn_recv (sock, &buf, NN_MSG, 0); if (bytes >= 0) { printf ("CLIENT (%s): RECEIVED \"%s\" SURVEY REQUEST\n", name, buf); nn_freemsg (buf); char *d = date(); int sz_d = strlen(d) + 1; // '\0' too printf ("CLIENT (%s): SENDING DATE SURVEY RESPONSE\n", name); int bytes = nn_send (sock, d, sz_d, 0); assert (bytes == sz_d); } } if (pfd [1].revents & NN_POLLIN) { char *buf2 = NULL; int bytes2 = nn_recv (sock2, &buf2, NN_MSG, 0); assert (bytes2 >= 0); printf ("CLIENT (%s): RECEIVED %s\n", name, buf2); nn_freemsg (buf2); } } return nn_shutdown (sock, 0); } int main (const int argc, const char **argv) { if (strncmp (SERVER, argv[1], strlen (SERVER)) == 0 && argc >= 2) return server (argv[2]); else if (strncmp (CLIENT, argv[1], strlen (CLIENT)) == 0 && argc >= 3) return client (argv[2], argv[3]); else { fprintf (stderr, "Usage: survey %s|%s <URL> <ARG> ...\n", SERVER, CLIENT); return 1; } } ---- When running the program I have two kind of behavior the bad one is that clients doesn't receive the date survey from server but they received the pub well As following output [ezerbib@localhost build]$ make run ( ./survey server ipc:///tmp/survey.ipc & server=$! \ ./survey client ipc:///tmp/survey.ipc client0 & client0=$! \ ./survey client ipc:///tmp/survey.ipc client1 & client1=$! \ ./survey client ipc:///tmp/survey.ipc client2 & client2=$! \ sleep 20 \ #kill $server $client0 $client1 $client2 \ killall -9 survey ) SERVER: SENDING DATE SURVEY REQUEST CLIENT (client2): Timeout! CLIENT (client0): Timeout! CLIENT (client1): Timeout! SERVER: PUBLISHING MSG HELLO from P3k CLIENT (client1): RECEIVED HELLO from P3k CLIENT (client0): RECEIVED HELLO from P3k CLIENT (client2): RECEIVED HELLO from P3k SERVER: SENDING DATE SURVEY REQUEST SERVER: PUBLISHING MSG HELLO from P3k CLIENT (client1): Timeout! CLIENT (client0): Timeout! CLIENT (client2): Timeout! CLIENT (client1): RECEIVED HELLO from P3k CLIENT (client2): RECEIVED HELLO from P3k CLIENT (client0): RECEIVED HELLO from P3k SERVER: SENDING DATE SURVEY REQUEST CLIENT (client1): Timeout! CLIENT (client2): Timeout! CLIENT (client0): Timeout! SERVER: PUBLISHING MSG HELLO from P3k CLIENT (client2): RECEIVED HELLO from P3k CLIENT (client1): RECEIVED HELLO from P3k CLIENT (client0): RECEIVED HELLO from P3k SERVER: SENDING DATE SURVEY REQUEST CLIENT (client2): Timeout! CLIENT (client1): Timeout! CLIENT (client0): Timeout! SERVER: PUBLISHING MSG HELLO from P3k CLIENT (client1): RECEIVED HELLO from P3k CLIENT (client0): RECEIVED HELLO from P3k CLIENT (client2): RECEIVED HELLO from P3k SERVER: SENDING DATE SURVEY REQUEST CLIENT (client1): Timeout! Sometimes another run some time later the output is good as attended server is sending survey and client are receiving survey and replying [ezerbib@localhost build]$ make run ( ./survey server ipc:///tmp/survey.ipc & server=$! \ ./survey client ipc:///tmp/survey.ipc client0 & client0=$! \ ./survey client ipc:///tmp/survey.ipc client1 & client1=$! \ ./survey client ipc:///tmp/survey.ipc client2 & client2=$! \ sleep 20 \ #kill $server $client0 $client1 $client2 \ killall -9 survey ) SERVER: SENDING DATE SURVEY REQUEST Message can be received from s1! CLIENT (client1): RECEIVED "DATE" SURVEY REQUEST CLIENT (client1): SENDING DATE SURVEY RESPONSE Message can be received from s1! CLIENT (client0): RECEIVED "DATE" SURVEY REQUEST CLIENT (client0): SENDING DATE SURVEY RESPONSE Message can be received from s1! CLIENT (client2): RECEIVED "DATE" SURVEY REQUEST CLIENT (client2): SENDING DATE SURVEY RESPONSE SERVER: RECEIVED "Thu Aug 7 15:42:18 2014" SURVEY RESPONSE SERVER: PUBLISHING MSG HELLO from P3k CLIENT (client1): RECEIVED HELLO from P3k CLIENT (client0): RECEIVED HELLO from P3k CLIENT (client2): RECEIVED HELLO from P3k SERVER: SENDING DATE SURVEY REQUEST Message can be received from s1! CLIENT (client1): RECEIVED "DATE" SURVEY REQUEST CLIENT (client1): SENDING DATE SURVEY RESPONSE Message can be received from s1! CLIENT (client0): RECEIVED "DATE" SURVEY REQUEST CLIENT (client0): SENDING DATE SURVEY RESPONSE Message can be received from s1! CLIENT (client2): RECEIVED "DATE" SURVEY REQUEST CLIENT (client2): SENDING DATE SURVEY RESPONSE SERVER: RECEIVED "Thu Aug 7 15:42:19 2014" SURVEY RESPONSE My question is what kind of problem could prevent the client not to receive the survey while it's the same executable ?? Thanks This mail was sent via Mail-SeCure System.