在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也很好,但我面临同样的问题试图做到这一点)。
“我面临着同样的问题” - 如果你真的说出了那个“同样的问题”是什么,以及你有什么问题,你的问题会好得多。 – WhozCraig
我不推荐zmq作为初学者框架。它封装了套接字API以至于你不知道发生了什么。另外它仍然丢失TCP通信中的第一条消息。相反,请使用boost asio。您将学习网络IO的基本概念。 – rustyx
在Zmq中,您可以在两个线程之间共享上下文,但永远不会*套接字。为什么不(在您的原始代码中):'zmq :: context_t context(1); std :: thread t_send(Send,context);'? – cibercitizen1