Quantcast
Channel: Active questions tagged zeromq - Stack Overflow
Viewing all articles
Browse latest Browse all 193

ZMQ_ROUTER Semantics: Dropping Disconnected Peers

$
0
0

I wanted to develop a reliable multi-client, single-server req/rep communication pattern. I decided to use ZMQ_REQ and ZMQ_ROUTER sockets in order to accomplish this task.

The ZeroMQ RFC states the following:

The ROUTER socket type SHALL create a double queue when a peerconnects to it. If this peer disconnects, the ROUTER socket SHALLdestroy its double queue and SHALL discard any messages it contains.

According to this semantics I expect messages ROUTER to drop disconnected clients. I developed the following code to test my design.

// Client Code// cppzmq: v4.10.0// libzmq: v4.3.5#include <zmq.hpp>#include <iostream>zmq::context_t context{1};bool reqrep(zmq::message_t &req, std::string addr){    zmq::socket_t client{context, zmq::socket_type::req};    client.set(zmq::sockopt::rcvtimeo, 2500);    client.set(zmq::sockopt::sndtimeo, 2500);    client.set(zmq::sockopt::immediate, true);    client.set(zmq::sockopt::linger, 0);    client.connect(addr);    if (!client.send(req))    {        std::cerr << "E: send timeout\n";        return false;    }    zmq::message_t rep;    if (client.recv(rep))    {        std::cout << "I: server replied OK (" << rep.to_string() << ")\n";        return true;    }    else    {        std::cerr << "E: receive timeout\n";        return false;    }}int main(){    std::string addr{"ipc:///tmp/server"};    int seq{};    while (true)    {        zmq::message_t req{std::to_string(seq++)};        reqrep(req, addr);    }    return 0;}
// Server Code// cppzmq: v4.10.0// libzmq: v4.3.5#include <unistd.h>#include <zmq_addon.hpp>#include <iostream>//  Provide random number from 0..(num-1)#define within(num) (int)((float)((num) * random()) / (RAND_MAX + 1.0))int main(){    zmq::context_t context(1);    zmq::socket_t server(context, ZMQ_ROUTER);    server.bind("ipc:///tmp/server");    while (1)    {        zmq::multipart_t mp;        auto req = zmq::recv_multipart(server, std::back_inserter(mp));        std::cout << "I: message received";        std::cout << mp.str() << std::endl;        if (!within(20))        {            std::cout << "I: simulating CPU overload" << std::endl;            sleep(20);        }        sleep(1); // Do work        zmq::send_multipart(server, mp);    }    return 0;}

The results doesn't satify my expectations (left: server, right: client). After 20 seconds of sleep, server still keeps the messages from the disconnected peers and processes them.left: server, right: client

Is there something I miss? I will be looking for feedbacks.


Viewing all articles
Browse latest Browse all 193

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>