1 /**
2 Nanomsg Example: Pipeline
3 */
4 module nanomsg.examples.pipeline;
5
6 import nanomsg;
7 import std.stdio;
8 import std.conv;
9 import std.string:toStringz;
10
11 ///
12 enum NODE0 ="node0";
13 ///
14 enum NODE1 ="node1";
15
16 ///
17 int node0 (string xurl)
18 {
19 int sock = nn_socket (AF_SP, NN_PULL);
20 auto url=xurl.toStringz;
21 assert(sock >= 0);
22 assert(nn_bind (sock, url) >= 0);
23 while (1)
24 {
25 char* buf = cast(char*)0;
26 int bytes = nn_recv (sock, &buf, NN_MSG, 0);
27 assert (bytes >= 0);
28 writefln("NODE0: RECEIVED %s bytes: \"%s\"", bytes,to!string(buf));
29 nn_freemsg (buf);
30 }
31 return 0;
32 }
33
34 ///
35 int node1 (string url, string msg)
36 {
37 int sz_msg = cast(int)msg.length + 1; // '\0' too
38 int sock = nn_socket (AF_SP, NN_PUSH);
39 assert(sock >= 0);
40 assert(nn_connect(sock, url.toStringz) >= 0);
41 writefln("NODE1: SENDING \"%s\"", msg);
42 int bytes = nn_send(sock, msg.toStringz, sz_msg, 0);
43 assert(bytes == sz_msg);
44 return nn_shutdown(sock, 0);
45 }
46
47 ///
48 int main (string[] argv)
49 {
50 if (argv.length>1)
51 {
52 if (NODE0==argv[1])
53 return node0(argv[2]);
54 else if (argv.length>2)
55 if (NODE1==argv[1])
56 return node1(argv[2], argv[3]);
57 } else
58 {
59 writefln("Usage: pipeline %s|%s <URL> <ARG> ...'",NODE0, NODE1);
60 return 1;
61 }
62 return 0;
63 }