[zeromq-dev] Empty message does not close ZMQ_STREAM socket?

Auer, Jens jens.auer at cgi.com
Mon Mar 21 10:06:28 CET 2016


Hi,

I am trying to close a TCP socket over a ZMQ_STREAM by sending an identity frame followed by an empty message, as described in the manual ("To close a specific connection, send the identity frame followed by a zero-length message"). I have a simple client/server example:
#include <zmq.hpp>
#include <iostream>
#include <cstdlib>

int main2() {
    std::string address = "tcp://127.0.0.1:5000";

    zmq::context_t zmq;
    zmq::socket_t server(zmq, ZMQ_STREAM);

    server.bind(address);

    zmq::message_t id;
    zmq::message_t m;
    server.recv(&id);
    server.recv(&m);
    std::cout << "Connection received: " << id.size() << std::endl;

    zmq::message_t empty{};

    server.send(id, ZMQ_SNDMORE);
    server.send(empty, ZMQ_SNDMORE );

    int i;
    std::cin >> i;

    return 0;
}

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

int main() {
    std::string address = "tcp://127.0.0.1:5000";

    zmq::context_t zmq;
    zmq::socket_t client(zmq, ZMQ_STREAM);

    client.connect(address);

    zmq::message_t m3;
    zmq::message_t m4;
    client.recv(&m3);
    client.recv(&m4);

    std::cout << "Connection established" << std::endl;

    {
        zmq::message_t m5;
        zmq::message_t m6;
        client.recv(&m5);
        client.recv(&m6);
    }

    std::cout << "Connection closed" << std::endl;
    int i;
    std::cin >> i;

    return 0;
}

When I start the server and then the client, the server will receive the connection message, but the empty message does not close the socket:
./stream_s 2
Connection received: 5
/tmp/stream_c
Connection established

tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      32615/./stream_s
tcp        0      0 127.0.0.1:5000          127.0.0.1:34270         ESTABLISHED 32615/./stream_s
tcp        0      0 127.0.0.1:34270         127.0.0.1:5000          ESTABLISHED 32618/stream_c

I have also created a second example where the server sends the close message twice. Here, the client actually receives the close message as an empty message. Why is this even possible over a ZMQ_STREAM socket?

I am using ZeroMQ 4.1.4, so the notification messages should be enabled by default without setting ZMQ_STREAM_NOTIFY, and I have also tested 4.1.2 to check for a regression.

Best wishes,
  Jens
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20160321/46f86249/attachment.htm>


More information about the zeromq-dev mailing list