如何从c+;中的.recv()和.send()方法读取ZeroMQ返回值+;? 我试图编写一个C++类,通过ZrOMQ来在两台计算机之间进行通信。

如何从c+;中的.recv()和.send()方法读取ZeroMQ返回值+;? 我试图编写一个C++类,通过ZrOMQ来在两台计算机之间进行通信。,c++,zeromq,C++,Zeromq,为了能够处理错误,我正在尝试读取.recv()-和.send()-方法的返回值,但我得到以下错误 错误:无法将赋值中的'zmq::send_result_t'{aka'zmq::detail::trival_optional'}转换为'int' ret=msocket.send(reply,zmq::send\u flags::none) 代码如下所示: Publisher::Publisher(dataHandler & mdatahandler) :datahandler(mdata

为了能够处理错误,我正在尝试读取
.recv()-
.send()-
方法的返回值,但我得到以下错误

错误:无法将赋值中的'zmq::send_result_t'{aka'zmq::detail::trival_optional'}转换为'int'
ret=msocket.send(reply,zmq::send\u flags::none)

代码如下所示:

Publisher::Publisher(dataHandler & mdatahandler) :datahandler(mdatahandler)
{
    // construct a REP (reply) socket and bind to interface

    socketState.bind("tcp://*:5555");
    //socketAngles.bind("tcp://*:5556");
    //socketCurrents.bind("tcp://*:5557");
}

Publisher::~Publisher()
{
    socketState.close();
    //socketAngles.close();
    //socketCurrents.close();
}

std::string Publisher::transfer(zmq::socket_t& msocket, std::string replyString,
    int receiveFlag = 0)
{
    zmq::send_result_t ret = 0;
    if (receiveFlag)
    {
        zmq::message_t receivedData;
        ret = msocket.recv(receivedData, zmq::recv_flags::none);
        if (verbose)
        {
            std::cout << "Received " << receivedData.to_string() << std::endl;
        }
        return receivedData.to_string();
    }
    zmq::message_t reply{ replyString.cbegin(), replyString.cend() };

    // send the reply to the client
    ret = msocket.send(reply, zmq::send_flags::none);

    if (ret == -1)
    {
        std::cout << zmq_strerror(errno) << std::endl;
    }
}
如何可靠地捕获错误?如果错误发生,是否有更好的方法处理错误

编辑:
我添加了
zmq::send\u result\u t
,但是我如何处理它呢?我无法将它与任何东西进行比较,也无法打印它。


如果您从未使用过ZeroMQ,
您可能会喜欢在深入了解更多细节之前先看看


Q:“我如何可靠地捕获错误是否有更好的方法来处理发生的错误?”

欢迎来练习零禅的艺术


A部分“我如何可靠地捕捉错误”: 首先了解语言工具。存在与工具和最佳实践以及其他应做和不应做的事情相关的例外情况。服从他们

B部分“a处理错误的更好方法”: 处理错误的最佳方法是根本避免错误-这并不能拯救地球(可以读到玛格丽特·汉密尔顿女士(她为阿波罗导航计算机软件做得很好,拯救了生命和民族自豪感)和她真正的方法论,它拯救了无法避免的主要冲突案例)

下一个更弱的策略是设计体系结构(然后是代码),彻底检查系统的状态(返回值、RTT时间和其他因素),以便在异常发生时以及在系统状态的完整上下文中持续准备处理异常(不要因为在十字路口中间站着瞎了眼而感到惊讶,一旦抛出异常……它会在稍后的时间被抛出,所以事先准备好,而不是惊慌失措的事后,诉诸但混乱的特设选项)

解决方案: 步骤1)
理解并掌握语言工具

步骤2)
了解并掌握ZeroMQ工具(任何
REP
都不能从
.send()开始)

步骤3)
了解并掌握已发布的ZeroMQ API,这里有成功异常处理细节所需的所有细节(预防性错误状态指示-隐藏在
{EINVAL | ETERM | ENOTSOCK | EINTR |…}
错误状态,针对每个API调用方法进行解释,并在适当的上下文中针对每个此类方法进行解释

如果仍然不相信,至少读一读神奇的Pieter HINTJENS的书“代码连接,第一卷”
,你会发现零禅的根本所在。


如果您从未使用过ZeroMQ,
您可能会喜欢在深入了解更多细节之前先看看


Q:“我如何可靠地捕获错误是否有更好的方法来处理发生的错误?”

欢迎来练习零禅的艺术


A部分“我如何可靠地捕捉错误”: 首先了解语言工具。有例外相关的工具和最佳实践以及其他应做和不应做的。遵守它们

B部分“a处理错误的更好方法”: 处理错误的最佳方法是根本避免错误-这并不能拯救地球(可以读到玛格丽特·汉密尔顿女士(她为阿波罗导航计算机软件做得很好,拯救了生命和民族自豪感)和她真正的方法论,它拯救了无法避免的主要冲突案例)

下一个更弱的策略是设计体系结构(然后是代码),彻底检查系统的状态(返回值、RTT时间和其他因素),以便在异常发生时以及在系统状态的完整上下文中持续准备处理异常(不要因为在十字路口中间站着瞎了眼而感到惊讶,一旦抛出异常……它会在稍后的时间被抛出,所以事先准备好,而不是惊慌失措的事后,诉诸但混乱的特设选项)

解决方案: 步骤1)
理解并掌握语言工具

步骤2)
了解并掌握ZeroMQ工具(任何
REP
都不能从
.send()开始)

步骤3)
了解并掌握已发布的ZeroMQ API,这里有成功异常处理细节所需的所有细节(预防性错误状态指示-隐藏在
{EINVAL | ETERM | ENOTSOCK | EINTR |…}
错误状态,针对每个API调用方法进行解释,并在适当的上下文中针对每个此类方法进行解释


如果仍然不相信,至少读一读神奇的Pieter HINTJENS的书“代码连接,第1卷”,你会找到Zero禅宗的根源。

使用正确的类型,不要将变量重复用于多种目的。我对zeromq比较陌生。正确的类型是什么?我试着查找
zmq::detail::trial_optional
,但没有任何意义编译器告诉过你
send
returns a
zmq::send_result_t
,所以使用它。使用正确的类型,不要将变量用于多种目的。我对zeromq相对较新。正确的类型是什么?我尝试查找
zmq::detail::trial_optional
,但没有任何意义
zmq::context_t context{ 1 };
zmq::socket_t socketState{ context, ZMQ_REP };