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