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 }