Skip to content

Instantly share code, notes, and snippets.

@bvarga
Created November 13, 2012 22:38
Show Gist options
  • Save bvarga/4068920 to your computer and use it in GitHub Desktop.
Save bvarga/4068920 to your computer and use it in GitHub Desktop.
zmq monitor disconnect event bug.
#include "../include/zmq.h"
#include "../include/zmq_utils.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "../src/platform.hpp"
#include <windows.h>
#include <process.h>
static unsigned int __stdcall req_socket_monitor (void *ctx)
{
zmq_event_t event;
int rc;
void *s = zmq_socket (ctx, ZMQ_PAIR);
assert (s);
rc = zmq_connect (s, "inproc://monitor.req");
assert (rc == 0);
while (true) {
zmq_msg_t msg;
zmq_msg_init (&msg);
rc = zmq_recvmsg (s, &msg, 0);
if (rc == -1 && zmq_errno() == ETERM) break;
assert (rc != -1);
memcpy (&event, zmq_msg_data (&msg), sizeof (event));
switch (event.event) {
case ZMQ_EVENT_CONNECTED:
printf ("connected: %s\n", event.data.connected.addr);
//assert( event.data.connected.addr == "tcp://127.0.0.1:5555");
break;
case ZMQ_EVENT_DISCONNECTED:
printf ("disconnected: %s\n", event.data.disconnected.addr);
//assert( event.data.disconnected.addr == "tcp://127.0.0.1:5555");
break;
default:
printf("event %d\n", event.event );
}
}
zmq_close (s);
return NULL;
}
int main (int argc, char *argv [])
{
HANDLE local_thread;
void *context = zmq_ctx_new ();
void *router = zmq_socket (context, ZMQ_ROUTER);
int rc;
// register a monitor endpoint for all socket events
rc = zmq_socket_monitor (router, "inproc://monitor.req", ZMQ_EVENT_ALL);
assert (rc == 0);
// spawn a monitoring thread
local_thread = (HANDLE) _beginthreadex (NULL, 0,
req_socket_monitor, context, 0 , NULL);
if (local_thread == 0) {
printf ("error in _beginthreadex\n");
return -1;
}
zmq_bind( router, "tcp://127.0.0.1:5555");
zmq_sleep(1);
void *dealer;
while (true) {
dealer = zmq_socket (context, ZMQ_DEALER);
zmq_connect( dealer, "tcp://127.0.0.1:5555" );
zmq_sleep( 1 );
zmq_disconnect( dealer, "tcp://127.0.0.1:5555" );
zmq_close( dealer );
}
zmq_close( router );
zmq_ctx_destroy (context);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment