I have a simple ZeroMQ request reply pattern, that I am trying to implement as two threads. However When I run the below code, I get the following error.
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
What am I doing wrong?
#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;
}
Aucun commentaire:
Enregistrer un commentaire