问题描述
我有一个简单的 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;
}
解决方法
您收到“无效参数”,因为您传递的地址是错误的 connect()
。
bind_param = protocol + "://*:" + "localhost" +std::to_string(port);
m_requestSocket.connect(bind_param);
您的代码将导致“tcp://*:localhost5555”
我想你想要“tcp://localhost:5555”