V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
harry890829
V2EX  ›  问与答

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

  •  
  •   harry890829 · 2015-11-25 16:37:02 +08:00 · 2326 次点击
    这是一个创建于 3304 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下为官方给出的 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;
    }
    
    3 条回复    2015-11-25 17:26:26 +08:00
    taozle
        1
    taozle  
       2015-11-25 16:57:05 +08:00
    如果我没记错的,这种情况应该是要设置`ZMQ_IDENTITY `
    harry890829
        2
    harry890829  
    OP
       2015-11-25 17:10:58 +08:00
    @taozle 多谢,我查下手册,看看是怎么弄
    harry890829
        3
    harry890829  
    OP
       2015-11-25 17:26:26 +08:00
    @taozle 查了下手册,顺着 ZMQ_IDENTITY 还看到了 ZMQ_ROUTER_HANDOVER ,是不是我把 ZMQ_ROUTER_HANDOVER 的值设置为 1 之后,就可以了?但是不知道应该修改那个值啊……是修改外部监听的那个 socket 还是 worker 内部的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:59 · PVG 09:59 · LAX 17:59 · JFK 20:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.