Skip to content

Commit

Permalink
Translated Lazy Pirate examples to C++
Browse files Browse the repository at this point in the history
  • Loading branch information
Hoelzlwimmer Andreas authored and hintjens committed Mar 1, 2011
1 parent 5fb492b commit ce57220
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 26 deletions.
83 changes: 70 additions & 13 deletions examples/C++/lpclient.cpp
Original file line number Diff line number Diff line change
@@ -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;
}
52 changes: 39 additions & 13 deletions examples/C++/lpserver.cpp
Original file line number Diff line number Diff line change
@@ -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.