微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在抛出“zmq::error_t”what() 实例后调用终止:无效参数

如何解决在抛出“zmq::error_t”what() 实例后调用终止:无效参数

我有一个简单的 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”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。