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 }