[zeromq-dev] How to make a client die if a server crashes.

Jim Garlick garlick at llnl.gov
Thu Feb 12 02:21:36 CET 2015


You can use zmonitor(3) with zmq_poll(3), e.g. to catch a disconnect
on a zmq socket called 'zsock':

    zmonitor_t *zmon;
    zmq_pollitem_t zp;
   
    if (!(zmon = zmonitor_new (zctx, zsock, ZMQ_EVENT_DISCONNECTED)))
        err_exit ("zmonitor_new");
    if (vopt)
        zmonitor_set_verbose (zmon, true);
    zp.socket = zmonitor_socket (zmon);
    zp.events = ZMQ_POLLIN;

Then zmq_poll on zp and whatever else.  When zsock is ready for reading,
do something like this:

    zmsg *zmsg;
    int event = 0;

    if ((zmsg = zmsg_recv (zp.socket))) {
        char *s = zmsg_popstr (zmsg);
        if (s) {
            event = strtoul (s, NULL, 10);
            free (s);
        }
        if (event == ZMQ_EVENT_DISCONNECTED)
            msg_exit ("lost connection");
        zmsg_destroy (&zmsg);
    }

Jim


On Wed, Feb 11, 2015 at 05:07:05PM -0800, Jonathan Bishop wrote:
> Hi,
> 
> I am integrating 0MQ into an existing system. Previously I was using unix
> sockets and I would detect POLLHUP | POLLERR | POLLNVAL on a client when
> the server died. I would do this using poll()...
> 
>   struct pollfd pfd;
>   pfd.fd = fd;
>   pfd.events = 0;
>   pfd.revents = 0;
>   rc = poll(&pfd, 1, 0);
>   assert(rc >= 0 || errno == EINTR);
>   if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL))
>       <shutdown somehow>
> 
> 
> Tried the equivalent code in 0MQ and ZMQ_POLLERR but no luck. Can someone
> help me?
> 
> Thanks,
> 
> Jon

> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev




More information about the zeromq-dev mailing list