【发布时间】:2021-09-27 00:40:11
【问题描述】:
我有一个简单的 ZeroMQ 请求回复模式,我试图将其实现为两个线程。但是,当我运行以下代码时,我收到以下错误。
C:\Users\karthik\Documents\Workspace\cpluspluspen\cmake-build-debug\zeromq\zmq_ex1\zmq_server.exe
Waiting on receive()connect to 5555
terminate called after throwing an instance of 'zmq::error_t'
what(): Invalid argument
Process finished with exit code 0
我做错了什么?
#include <zmq.hpp>
#include <iostream>
#include <unistd.h>
#include <future>
class ZmqServer{
public:
ZmqServer() : m_context(1), m_replySocket(m_context, ZMQ_REP), m_requestSocket(m_context, ZMQ_REQ) {
}
void Bind(std::string protocol ,int port){
std::string bind_param;
bind_param = protocol + "://*:" + std::to_string(port);
m_replySocket.bind(bind_param);
}
void receive(){
zmq::message_t request;
// Wait for next request from client
m_replySocket.recv (&request);
std::cout << "Received message : " << request << std::endl;
}
void send(std::string msg){
// Send reply back to client
zmq::message_t reply (msg.size());
memcpy (reply.data (), msg.c_str(), 5);
m_replySocket.send (reply);
}
void connect(std::string protocol, int port) {
std::string bind_param;
bind_param = protocol + "://*:" + "localhost" +std::to_string(port);
m_requestSocket.connect(bind_param);
}
private:
zmq::context_t m_context;
zmq::socket_t m_replySocket;
zmq::socket_t m_requestSocket;
};
void serverThread(std::shared_ptr<ZmqServer> zmq)
{
std::cout << "Waiting on receive()" << std::endl;
sleep(1);
zmq->receive();
sleep(1);
zmq->send("World");
}
void clientThread(std::shared_ptr<ZmqServer> zmq)
{
std::cout << "connect to 5555" << std::endl;
zmq->connect("tcp", 5555);
zmq->send("Hello");
sleep(1);
zmq->receive();
}
int main () {
auto zmq = std::make_shared<ZmqServer>();
zmq->Bind("tcp", 5555);
auto sThread = std::thread( serverThread, std::ref(zmq));
auto cThread = std::thread(clientThread, std::ref(zmq));
cThread.join();
sThread.join();
return 0;
}
【问题讨论】:
-
你为什么要把
std::ref(zmq)传递给线程函数,而它们都没有引用? -
至于异常,您是否尝试在调试器中捕获它以找出它在您的代码中发生的位置?底层的 ZMQ 对象是线程安全的吗?
-
ZeroMQ REQ/REP 套接字不是线程安全的。