将ZMQ上下文传递给线程

时间:2016-08-21 20:08:56

标签: c++ sockets zeromq

在C ++中,我使用ZeroMQ构建一个简单的客户端 - 服务器聊天应用程序。一旦在main中初始化了上下文,我想将它传递给一个线程并在那里声明用于输出用户消息的套接字(即执行发送)。这是我当前的代码(客户端/用户端):

void Send(zmq::context_t& c ) // To get messages from user and send them to the server
{
    zmq::socket_t socket(c, ZMQ_REQ);
    socket.connect ("tcp://192.168.1.84:5555");

    std::string mssg;

    while (true) {

        std::getline(std::cin, mssg);

        if(mssg == "#exit")
        {
            killApp = true; // an atomic<bool> used to terminate all threads
            break;
        }
        zmq::message_t mssg_(mssg.length());
        std::memcpy(mssg_.data(), mssg.data(), mssg.length());

        socket.send(mssg_);

   }

}

int main ()
{
    // Initialising the context
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
    std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK

    {
       // do some stuff in the main thread (e.g. display the messages)
    }

    t_send.join();
    return 0;
}

我试图通过引用线程来传递上下文,这样我就可以创建一个套接字并执行其余的操作。但我不知道如何正确地做到这一点。 (或者,传递一个zmq :: socket_t也没关系,但是我在尝试这样做时遇到了同样的问题。)

2 个答案:

答案 0 :(得分:0)

以下是我如何解决它:将上下文作为 void 指针传递,然后将其转换回 zmq :: context_t

void Send(void* context ) // To get messages from user and send them to the server
{ 
    zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ);
    s.connect ("tcp://192.168.1.84:5555");
    ...
    ...
}

int main()
{
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1);
    std::thread t_send(Send, static_cast<void*>(context.get()));
    ...
    return 0;
}

希望将来帮助某人。

答案 1 :(得分:0)

您可以在zmqHelper中找到一些示例。有一个聊天的例子,许多线程通过inproc套接字(共享上下文)进行通信,以及一个带有worker的服务器(也通过inproc连接)。