Permalink
Browse files

Translated Lazy Pirate examples to C++

  • Loading branch information...
1 parent 5fb492b commit ce57220f0a202390762505286307a6ffa9153076 Hoelzlwimmer Andreas committed with hintjens Mar 1, 2011
Showing with 109 additions and 26 deletions.
  1. +70 −13 examples/C++/lpclient.cpp
  2. +39 −13 examples/C++/lpserver.cpp
View
@@ -1,13 +1,70 @@
-No-one has translated the lpclient example into C++ yet. Be the first to create
-lpclient in C++ and get one free Internet! If you're the author of the C++
-binding, this is a great way to get people to use 0MQ in C++.
-
-To submit a new translation email it to zeromq-dev@lists.zeromq.org. Please:
-
-* Stick to identical functionality and naming used in examples so that readers
- can easily compare languages.
-* You MUST place your name as author in the examples so readers can contact you.
-* You MUST state in the email that you license your code under the MIT/X11
- license.
-
-Subscribe to the email list at http://lists.zeromq.org/mailman/listinfo/zeromq-dev.
+//
+// Lazy Pirate client
+// Use zmq_poll to do a safe request-reply
+// To run, start piserver and then randomly kill/restart it
+//
+#include "zhelpers.hpp"
+
+#define REQUEST_TIMEOUT 2500 // msecs, (> 1000!)
+#define REQUEST_RETRIES 3 // Before we abandon
+// Helper function that returns a new configured socket
+// connected to the Hello World server
+//
+static zmq::socket_t * s_client_socket(zmq::context_t & context) {
+ printf("I: connecting to server...\n");
+ zmq::socket_t * client = new zmq::socket_t(context, ZMQ_REQ);
+ client->connect("tcp://localhost:5555");
+
+ // Configure socket to not wait at close time
+ int linger = 0;
+ client->setsockopt(ZMQ_LINGER, &linger, sizeof(linger));
+ return client;
+}
+
+int main() {
+ zmq::context_t context(1);
+
+ zmq::socket_t * client = s_client_socket(context);
+
+ printf("I: connecting to server...\n");
+
+ int sequence = 0;
+ int retries_left = REQUEST_RETRIES;
+ while (retries_left) {
+ // We send a request, then we work to get a reply
+ char request[10];
+ sprintf(request, "%d", ++sequence);
+ s_send(*client, request);
+ sleep(1);
+ int expect_reply = 1;
+ while (expect_reply) {
+ // Poll socket for a reply, with timeout
+ zmq::pollitem_t items[] = { { *client, 0, ZMQ_POLLIN, 0 } };
+ zmq::poll(&items[0], 1, REQUEST_TIMEOUT * 1000);
+ // If we got a reply, process it
+ if (items[0].revents & ZMQ_POLLIN) {
+ // We got a reply from the server, must match sequence
+ std::string *reply = s_recv(*client);
+ if (atoi(reply->c_str()) == sequence) {
+ printf("I: server replied OK (%s)\n", reply->c_str());
+ retries_left = REQUEST_RETRIES;
+ expect_reply = 0;
+ } else
+ printf("E: malformed reply from server: %s\n", reply->c_str());
+
+ delete reply;
+ } else if (--retries_left == 0) {
+ printf("E: server seems to be offline, abandoning\n");
+ break;
+ } else {
+ printf("W: no response from server, retrying...\n");
+ // Old socket will be confused; close it and open a new one
+ delete client;
+ client = s_client_socket(context);
+ // Send request again, on new socket
+ s_send(*client, request);
+ }
+ }
+ }
+ return 0;
+}
View
@@ -1,13 +1,39 @@
-No-one has translated the lpserver example into C++ yet. Be the first to create
-lpserver in C++ and get one free Internet! If you're the author of the C++
-binding, this is a great way to get people to use 0MQ in C++.
-
-To submit a new translation email it to zeromq-dev@lists.zeromq.org. Please:
-
-* Stick to identical functionality and naming used in examples so that readers
- can easily compare languages.
-* You MUST place your name as author in the examples so readers can contact you.
-* You MUST state in the email that you license your code under the MIT/X11
- license.
-
-Subscribe to the email list at http://lists.zeromq.org/mailman/listinfo/zeromq-dev.
+//
+// Lazy Pirate server
+// Binds REQ socket to tcp://*:5555
+// Like hwserver except:
+// - echoes request as-is
+// - randomly runs slowly, or exits to simulate a crash.
+//
+#include "zhelpers.hpp"
+
+int main ()
+{
+ srandom ((unsigned) time (NULL));
+
+ zmq::context_t context(1);
+ zmq::socket_t server(context, ZMQ_REP);
+ server.bind("tcp://*:5555");
+
+ int cycles = 0;
+ while (1) {
+ std::string *request = s_recv (server);
+ cycles++;
+
+ // Simulate various problems, after a few cycles
+ if (cycles > 3 && within (3) == 0) {
+ printf ("I: simulating a crash\n");
+ break;
+ }
+ else
+ if (cycles > 3 && within (3) == 0) {
+ printf ("I: simulating CPU overload\n");
+ sleep (5);
+ }
+ printf ("I: normal request (%s)\n", request->c_str());
+ sleep (1); // Do some heavy work
+ s_send (server, *request);
+ delete request;
+ }
+ return 0;
+}

0 comments on commit ce57220

Please sign in to comment.