Skip to content

socket monitor behavior #384

@raymanfx

Description

@raymanfx

I'm interested in knowing about peer disconnect events for ZMQ pair/pair and req/rep sockets.
Consider the following example code:

#include <iostream>
#include <thread>

#include <zmq.hpp>

int main(int argc, char *argv[]) {
    zmq::context_t ctx(1);
    zmq::socket_t s1(ctx, zmq::socket_type::rep);
    zmq::socket_t s2(ctx, zmq::socket_type::req);
    zmq::monitor_t monitor;
    zmq::socket_t monitor_socket(ctx, zmq::socket_type::pair);
    bool main_loop = true;

    monitor.init(s1, "inproc://events");
    monitor_socket.connect("inproc://events");

    std::thread monitor_thread([&]() {
        // monitor the control socket
        while (main_loop) {
            zmq_event_t event;
            zmq::message_t event_msg;
            size_t event_msg_len;

            try {
                event_msg_len = monitor_socket.recv(event_msg).value_or(0);
                std::cout << "Event Message Size: " << event_msg_len << std::endl;
                if (event_msg_len != sizeof(event)) {
                    continue;
                }

                auto data = reinterpret_cast<std::byte*>(event_msg.data());
                std::memcpy(&event, data, event_msg_len);

                switch (event.event) {
                case ZMQ_EVENT_DISCONNECTED:
                    std::cout << "Event: Disconnected" << std::endl;
                    break;
                case ZMQ_EVENT_CLOSED:
                    std::cout << "Event: Closed" << std::endl;
                    break;
                }
            } catch (...) {
                // swallow
            }
        }
    });

    s1.bind("tcp://*:8088");
    s2.connect("tcp://localhost:8088");

    int a = 7;
    zmq::message_t msg(&a, sizeof(int));
    s2.send(msg);
    s1.recv(msg);
    a = *(reinterpret_cast<int*>(msg.data()));
    std::cout << "Received int: " << a << std::endl;

    s2.close();

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));

    main_loop = false;
    if (monitor_thread.joinable()) {
        monitor_thread.join();
    }

    return 0;
}

I can't seem to get any events from on the s1 socket (which should be the "master", as in server).
In fact, I am never seeing any events pop up at all.

I'm on Fedora 31 with the latest updates installed, cppzmq is at version: 4.5.0-1.fc31.
What am I doing wrong here?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions