[zeromq-dev] ZMQ allows two sockets to bind to the same address/port on OS X.

Keith Henrickson Keith.Henrickson at nominum.com
Sat Nov 8 01:30:09 CET 2014

I put together the following program to show the issue. It seems if the option ZMQ_IPV4ONLY is set to 0 (to enable IPV6), then ZMQ as running on OS X allows two sockets to bind to the same port, provided the address used is For instance, as in the test program, I can construct two sockets, both bound to “tcp://”, as long as ZMQ_IPV4ONLY is set to 0. If the option is set to 1, or the test program is run in Linux, centos65…. then things work as expected.

Uname of ‘broken’ OS X system:
Darwin khenrick.ddns.nominum.com<http://khenrick.ddns.nominum.com> 14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64 x86_64

Uname of ‘working’ Linux system:
Linux vagrant-centos65 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

#include <iostream>
#include <random>
#include <zmq.hpp>

using namespace std;

static const char *DEFAULT_ADDR = "tcp://";

 * ROUTER socket
zmq::socket_t *init_socket(zmq::context_t &context, std::string address, int v4only) {
zmq::socket_t *socket_ptr = new zmq::socket_t(context, ZMQ_ROUTER);
cout << "Binding router socket..." << endl;

socket_ptr->setsockopt(ZMQ_IDENTITY, address.data(), address.size());

    int timeout(0);
    socket_ptr->setsockopt(ZMQ_RCVTIMEO, &timeout, sizeof(timeout));
    socket_ptr->setsockopt(ZMQ_SNDTIMEO, &timeout, sizeof(timeout));
    socket_ptr->setsockopt(ZMQ_IPV4ONLY, &v4only, sizeof(v4only));


    return socket_ptr;

void test_two_socks(int v4only) {
    zmq::context_t ctx;

    zmq::socket_t *zmq_ptr_a = init_socket(ctx, DEFAULT_ADDR, v4only);
    zmq::socket_t *zmq_ptr_b = init_socket(ctx, DEFAULT_ADDR, v4only);

    if (zmq_ptr_a != nullptr) {
        cout << "Bye A!" << endl;

    if (zmq_ptr_b != nullptr) {
        cout << "Bye B!" << endl;

 * Main entry point.
main (int argc, char ** argv)
    std::cout << "This succeeds" << std::endl;

    std::cout << "This fails" << std::endl;

    return 0;

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20141108/cb3685e5/attachment.htm>

More information about the zeromq-dev mailing list