不知道有人使用 zmq/zeromq 公共库么?

2015-11-25 16:37:02 +08:00
 harry890829

以下为官方给出的 zmq c++多线程 demo ,我的项目也是从这个改版出来的,但是我遇到一个非常严重的问题,当我有多个客户端同时访问的时候就出现了问题。
情况如下:
我们假设 A/B/C 三个客户端,同时发送 a/b/c 给服务器,服务器的工作就是把接收到的字符串完全返回,正常的话,客户端应该接收到的回复也是 a/b/c 。
但是我这里会出现的情况是,收到: a/a/c 或 b/b/c 等
也就是说,会把应该分来应该发送给 a 的,也发送给了 b ,同时 b 的那条就丢失了

这种情况有人遇到过么?

#include <pthread.h>
#include <unistd.h>
#include <cassert>
#include <string>
#include <iostream>
#include <zmq.hpp>

void *worker_routine (void *arg)
{
    zmq::context_t *context = (zmq::context_t *) arg;

    zmq::socket_t socket (*context, ZMQ_REP);
    socket.connect ("inproc://workers");

    while (true) {
        //  Wait for next request from client
        zmq::message_t request;
        socket.recv (&request);
        std::cout << "Received request: [" << (char*) request.data() << "]" << std::endl;

        //  Do some 'work'
        sleep (1);

        //  Send reply back to client
        zmq::message_t reply (6);
        memcpy ((void *) reply.data (), "World", 6);
        socket.send (reply);
    }
    return (NULL);
}

int main ()
{
    //  Prepare our context and sockets
    zmq::context_t context (1);
    zmq::socket_t clients (context, ZMQ_ROUTER);
    clients.bind ("tcp://*:5555");
    zmq::socket_t workers (context, ZMQ_DEALER);
    workers.bind ("inproc://workers");

    //  Launch pool of worker threads
    for (int thread_nbr = 0; thread_nbr != 5; thread_nbr++) {
    pthread_t worker;
    pthread_create (&worker, NULL, worker_routine, (void *) &context);
    }
    //  Connect work threads to client threads via a queue
    zmq::proxy (clients, workers, NULL);
    return 0;
}
2306 次点击
所在节点    问与答
3 条回复
taozle
2015-11-25 16:57:05 +08:00
如果我没记错的,这种情况应该是要设置`ZMQ_IDENTITY `
harry890829
2015-11-25 17:10:58 +08:00
@taozle 多谢,我查下手册,看看是怎么弄
harry890829
2015-11-25 17:26:26 +08:00
@taozle 查了下手册,顺着 ZMQ_IDENTITY 还看到了 ZMQ_ROUTER_HANDOVER ,是不是我把 ZMQ_ROUTER_HANDOVER 的值设置为 1 之后,就可以了?但是不知道应该修改那个值啊……是修改外部监听的那个 socket 还是 worker 内部的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/238851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX