1 /**
2     Nanomsg Example: ReqRep
3 */
4 module nanomsg.examples.reqrep;
5 
6 import std.stdio;
7 import std.conv;
8 import std.datetime;
9 import core.thread;
10 import nanomsg;
11 
12 ///
13 string date ()
14 {
15   return Clock.currTime.toSimpleString();
16 }
17 
18 ///
19 enum NODE0="node0";
20 ///
21 enum NODE1="node1";
22 ///
23 enum DATE="DATE";
24 
25 ///
26 int node0(string surl)
27 {
28   char* url=cast(char*)surl;
29   int sz_date = cast(int)DATE.length+1;
30   int sock = nn_socket (AF_SP, NN_REP);
31   assert (sock >= 0);
32   assert (nn_bind (sock, url) >= 0);
33   while (1)
34     {
35       char *buf = cast(char*)0;
36       int bytes = nn_recv(sock, &buf, NN_MSG, 0);
37       assert (bytes >= 0);
38       if (to!string(buf)==DATE)
39       {
40           writefln("NODE0: RECEIVED DATE REQUEST");
41           auto d=date();
42           int sz_d = cast(int)d.length + 1; // '\0' too
43           writefln("NODE0: SENDING DATE %s", d);
44           bytes = nn_send (sock, cast(char*)d, sz_d, 0);
45           assert (bytes == sz_d);
46         }
47       nn_freemsg (buf);
48     }
49   return nn_shutdown (sock, 0);
50 }
51 
52 
53 ///
54 int node1 (string url)
55 {
56   int sz_date = cast(int)DATE.length+1;
57   char *buf = cast(char*)0;
58   int bytes = -1;
59   int sock = nn_socket (AF_SP, NN_REQ);
60   assert (sock >= 0);
61   assert (nn_connect (sock, cast(char*)url) >= 0);
62   writefln("NODE1: SENDING DATE REQUEST %s", DATE);
63   bytes = nn_send (sock, cast(char*)DATE, sz_date, 0);
64   assert (bytes == sz_date);
65   bytes = nn_recv (sock, &buf, NN_MSG, 0);
66   assert (bytes >= 0);
67   writefln("NODE1: RECEIVED DATE %s", to!string(buf), bytes);
68   nn_freemsg (buf);
69   return nn_shutdown (sock, 0);
70 }
71 
72  
73 ///
74 int main(string[] argv)
75 {
76   if (argv.length>1)
77     if (argv[1]==NODE0)
78       return node0(argv[2]);
79   if (argv.length>1)
80       if (argv[1]==NODE1)
81         return node1(argv[2]);
82    writefln("Usage: reqrep %s|%s <URL> <ARG> ...'",NODE0, NODE1);
83    return 1;
84 }
85