[nanomsg] Re: nanomsg forum

  • From: Eric Zerbib <ezerbib@xxxxxxxxxxxx>
  • To: "nanomsg@xxxxxxxxxxxxx" <nanomsg@xxxxxxxxxxxxx>
  • Date: Thu, 7 Aug 2014 16:04:33 +0300

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.


Other related posts:

  • » [nanomsg] Re: nanomsg forum - Eric Zerbib