Hi there,

I keep getting an EAGAIN error with ZeroMQ 3.2.2 on MacOSX 10.8.2 when calling 
zmq_disconnect on an inproc socket (works fine for tcp). Minimal testcase is 
attached. It seems the problem is in socket_base.cpp:588 as the "endpoints" 
multimap does not contain inproc endpoints. Which is to be expected, because 
zmq::socket_base_t::connect returns 0 for inproc sockets without ever adding 
the endpoints (socket_base.cpp:556).

I will submit a bug report shortly but would like to get a confirmation first 
that this is not intended behavior. In my opinion the type of endpoint should 
not cause the semantics of zmq_connect / zmq_disconnect to change.

Best regards
Stefan


#include <zmq.h>
#include <inttypes.h>
#include <string.h>

int main(int argc, char** argv) {
  void* context = zmq_ctx_new();
  void* pubSocket;
  void* subSocket;



  (pubSocket = zmq_socket(context, ZMQ_XPUB))         || printf("zmq_socket: 
%s\n", zmq_strerror(errno));
  (subSocket = zmq_socket(context, ZMQ_SUB))          || printf("zmq_socket: 
%s\n", zmq_strerror(errno));
  zmq_setsockopt(subSocket, ZMQ_SUBSCRIBE, "foo", 3)  && 
printf("zmq_setsockopt: %s\n",zmq_strerror(errno));



  zmq_bind(pubSocket, "inproc://someInProcDescriptor") && printf("zmq_bind: 
%s\n", zmq_strerror(errno));
  //  zmq_bind(pubSocket, "tcp://*:30010") && printf("zmq_bind: %s\n", 
zmq_strerror(errno));



  int32_t more;
  size_t more_size = sizeof(more);
  int iteration = 0;



  while(1) {
    zmq_pollitem_t items [] = {
      { pubSocket,    0, ZMQ_POLLIN, 0 }, // read subscriptions
    };
    zmq_poll(items, 1, 500);



    if (items[0].revents & ZMQ_POLLIN) {
      while (1) {
        zmq_msg_t msg;
        zmq_msg_init (&msg);
        zmq_msg_recv (&msg, pubSocket, 0);
        int msgSize = zmq_msg_size(&msg);
        char* buffer = (char*)zmq_msg_data(&msg);



        if (buffer[0] == 0) {
          printf("unsubscribing from %s\n", strndup(buffer + 1, msgSize - 1));
        } else {
          printf("subscribing on %s\n", strndup(buffer + 1, msgSize - 1));
        }



        zmq_getsockopt (pubSocket, ZMQ_RCVMORE, &more, &more_size);
        zmq_msg_close (&msg);



        if (!more)
          break;      //  Last message part
      }
    }



    if (iteration == 1) {
      zmq_connect(subSocket, "inproc://someInProcDescriptor") && 
printf("zmq_connect: %s\n", zmq_strerror(errno));
      //      zmq_connect(subSocket, "tcp://127.0.0.1:30010") && 
printf("zmq_connect: %s\n", zmq_strerror(errno));
    }



    if (iteration == 2) {
      zmq_disconnect(subSocket, "inproc://someInProcDescriptor") && 
printf("zmq_disconnect(%d): %s\n", errno, zmq_strerror(errno));
      //      zmq_disconnect(subSocket, "tcp://127.0.0.1:30010") && 
printf("zmq_disconnect: %s\n", zmq_strerror(errno));
    }



    if (iteration == 3) {
      break;
    }



    iteration++;
  }



  zmq_close(pubSocket) && printf("zmq_close: %s", zmq_strerror(errno));
  zmq_close(subSocket) && printf("zmq_close: %s", zmq_strerror(errno));



  zmq_ctx_destroy(context);
  return 0;
}
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to