forked from booksbyus/zguide
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Translated Lazy Pirate examples to C++
- Loading branch information
Showing
2 changed files
with
109 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |