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