2016-08-21 151 views
2

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

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也很好,但我面临同样的问题试图做到这一点)。

+1

“我面临着同样的问题” - 如果你真的说出了那个“同样的问题”是什么,以及你有什么问题,你的问题会好得多。 – WhozCraig

+0

我不推荐zmq作为初学者框架。它封装了套接字API以至于你不知道发生了什么。另外它仍然丢失TCP通信中的第一条消息。相反,请使用boost asio。您将学习网络IO的基本概念。 – rustyx

+0

在Zmq中,您可以在两个线程之间共享上下文,但永远不会*套接字。为什么不(在您的原始代码中):'zmq :: context_t context(1); std :: thread t_send(Send,context);'? – cibercitizen1

回答

0

这里是我是如何解决它:传递上下文作为指针然后铸造回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; 
} 

希望它可以帮助别人的未来。

0

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