将ZMQ上下文传递给线程 在C++中,我使用ZrOMQ来构建一个简单的客户端-服务器聊天应用程序。一旦在main中初始化了上下文,我想将其传递给一个线程,并在那里声明用于输出用户消息的套接字(即,执行发送)。这是我的当前代码(客户端/用户端): void Send(zmq::context\u t&c)//从用户获取消息并将其发送到服务器 { zmq::socket\u t socket(c,zmq\u-REQ); socket.connect(“tcp://192.168.1.84:5555"); std::字符串mssg; while(true){ 标准::getline(标准::cin,mssg); 如果(mssg==“#退出”) { killApp=true;//用于终止所有线程的原子 打破 } 消息(mssg.length()); std::memcpy(mssg_u2;.data(),mssg.data(),mssg.length()); socket.send(mssg_); } } int main() { //初始化上下文 std::shared_ptr context=std::make_shared(1); std::thread t_send(send,*context.get());//这不起作用 { //在主线程中执行一些操作(例如显示消息) } t_send.join(); 返回0; }

将ZMQ上下文传递给线程 在C++中,我使用ZrOMQ来构建一个简单的客户端-服务器聊天应用程序。一旦在main中初始化了上下文,我想将其传递给一个线程,并在那里声明用于输出用户消息的套接字(即,执行发送)。这是我的当前代码(客户端/用户端): void Send(zmq::context\u t&c)//从用户获取消息并将其发送到服务器 { zmq::socket\u t socket(c,zmq\u-REQ); socket.connect(“tcp://192.168.1.84:5555"); std::字符串mssg; while(true){ 标准::getline(标准::cin,mssg); 如果(mssg==“#退出”) { killApp=true;//用于终止所有线程的原子 打破 } 消息(mssg.length()); std::memcpy(mssg_u2;.data(),mssg.data(),mssg.length()); socket.send(mssg_); } } int main() { //初始化上下文 std::shared_ptr context=std::make_shared(1); std::thread t_send(send,*context.get());//这不起作用 { //在主线程中执行一些操作(例如显示消息) } t_send.join(); 返回0; },c++,sockets,zeromq,C++,Sockets,Zeromq,我试图通过引用将上下文传递给线程,以便创建套接字并执行其余操作。但我不知道如何正确地做。(或者,传递一个zmq::socket也可以,但我在尝试这样做时遇到了相同的问题)。以下是我解决问题的方法:将上下文作为空指针传递,然后将其转换回zmq::context\t: void Send(void*context)//从用户获取消息并将其发送到服务器 { zmq::socket_t s(*(zmq::context_t*)context,zmq_REQ); s、 连接(“tcp://192.168

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

以下是我解决问题的方法:将上下文作为空指针传递,然后将其转换回zmq::context\t:

void Send(void*context)//从用户获取消息并将其发送到服务器
{ 
zmq::socket_t s(*(zmq::context_t*)context,zmq_REQ);
s、 连接(“tcp://192.168.1.84:5555");
...
...
}
int main()
{
std::shared_ptr context=std::make_shared(1);
std::线程t_send(send,static_cast(context.get());
...
返回0;
}

希望它对将来的人有所帮助。

您可以在中找到一些样品。这里有一个聊天的例子,许多线程通过inproc套接字(共享上下文)进行通信,还有一个服务器与工作人员(也通过inproc连接)。

“我面临着同样的问题”-如果您确实说明了“同样的问题”是什么,您的问题会好得多,我不推荐zmq作为入门框架。它对socket API的包装太多,以至于您无法理解发生了什么。此外,它仍然会丢失TCP通信中的第一条消息。请改用boost asio。您将学习网络IO的基本概念。在Zmq中,您可以共享上下文,但不能在两个线程之间共享套接字。为什么不呢(在您的原始代码中):
zmq::context\u t context(1);std::线程t_send(send,context)
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;
}
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;
}