首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在引发'zmq::error_t‘what()的实例后调用terminate :无效参数

在引发'zmq::error_t‘what()的实例后调用terminate :无效参数
EN

Stack Overflow用户
提问于 2021-07-19 18:29:52
回答 1查看 363关注 0票数 0

我有一个简单的ZeroMQ请求应答模式,我试图将其实现为两个线程。然而,当我运行下面的代码时,我得到了以下错误。

代码语言:javascript
运行
复制
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

我做错了什么?

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2021-07-21 01:07:14

你得到了“无效的参数”,因为你给connect()传递了一个错误的地址。

代码语言:javascript
运行
复制
    bind_param = protocol + "://*:" + "localhost" +std::to_string(port);
    m_requestSocket.connect(bind_param);

您的代码将导致"tcp://*:localhost5555“

我想你需要"tcp://localhost:5555“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68438981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档