将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::socket也可以,但我在尝试这样做时遇到了相同的问题)。以下是我解决问题的方法:将上下文作为空指针传递,然后将其转换回zmq::context\t:将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
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;
}