Skip to content

Instantly share code, notes, and snippets.

@rjsmith
Created November 12, 2011 20:38
Show Gist options
  • Select an option

  • Save rjsmith/1361080 to your computer and use it in GitHub Desktop.

Select an option

Save rjsmith/1361080 to your computer and use it in GitHub Desktop.
ZeroMQ 3.1 REQ/REP poll revents behaviour compared with 2.1.10
public function testPollingReqRepZMQ3() {
var pollinout:Int = ZMQ.ZMQ_POLLIN() | ZMQ.ZMQ_POLLOUT();
var ctx:ZContext;
var req:ZMQSocket, rep:ZMQSocket;
var poller:ZMQPoller;
// ** Test tcp req/rep poller revents
var randomPort:Int = Math.round(Math.random() * 18000) + 2000;
ctx = new ZContext();
req = ctx.createSocket(ZMQ_REQ);
rep = ctx.createSocket(ZMQ_REP);
req.bind("tcp://*:"+randomPort);
rep.connect("tcp://localhost:"+randomPort);
Sys.sleep(0.1); // Allow sockets time to connect
poller = new ZMQPoller();
poller.registerSocket(req, pollinout);
poller.registerSocket(rep, pollinout);
var numSocks = poller.poll(10 * ZMQ.ZMQ_POLL_MSEC());
trace ("tcp:"+numSocks); // Returns:
// "2" in ZMQ 3.1
// "1" in ZMQ 2.1.0
ctx.destroy();
// ** Test ipc req/rep poller revents
ctx = new ZContext();
req = ctx.createSocket(ZMQ_REQ);
rep = ctx.createSocket(ZMQ_REP);
req.bind("ipc://test.poller");
rep.connect("ipc://test.poller");
Sys.sleep(0.1); // Allow sockets time to connect
poller = new ZMQPoller();
poller.registerSocket(req, pollinout);
poller.registerSocket(rep, pollinout);
var numSocks = poller.poll(10 * ZMQ.ZMQ_POLL_MSEC());
trace ("ipc:"+numSocks); // Returns:
// "2" in ZMQ 3.1
// "1" in ZMQ 2.1.0
ctx.destroy();
// ** Test inproc req/rep poller revents
ctx = new ZContext();
req = ctx.createSocket(ZMQ_REQ);
rep = ctx.createSocket(ZMQ_REP);
req.bind("inproc://test.poller");
rep.connect("inproc://test.poller");
Sys.sleep(0.1); // Allow sockets time to connect
poller = new ZMQPoller();
poller.registerSocket(req, pollinout);
poller.registerSocket(rep, pollinout);
var numSocks = poller.poll(10 * ZMQ.ZMQ_POLL_MSEC());
trace ("inproc:"+numSocks); // Returns:
// "1" in ZMQ 3.1
// "1" in ZMQ 2.1.0
ctx.destroy();
assertTrue(true);
}
@rjsmith
Copy link
Author

rjsmith commented Nov 12, 2011

This is a snippet from with a Haxe.unit.TestCase class that demonstrates the different behaviour in ZMQ 3.1 between inproc and ipc/tcp transports when testing the results of a poller.poll() on a pair of REQ/REP sockets which have been connected but no messages passed between them. I found that:

  1. For tcp or icp transports, the REP socket reports it is ready for a Read (ie poller.pollin(2) is TRUE), although if you do a read on it, it returns null (no data). For inproc, it returns 1 (and only the REQ socket is flagged ready, for a write).
  2. In ZMQ 2.1.10, the poller.poll() call always returns 1 (and on further examination, it is the REQ socket that is ready for a Write, which is what you would expect).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment