C++ ZMQ轮询不工作

C++ ZMQ轮询不工作,c++,zeromq,C++,Zeromq,运行以下代码时,第一次调用zmq_poll(即返回-1)时出错。zmq\u errno()返回128,zmr\u strerror(128)调用返回“未知错误”。我已经使用C++的ZMQ了一段时间,现在没有任何问题,但是我不能得到一个调用 ZMQYPopule,不管它多么简单。 调用zmq::version表明我正在使用zmq版本2.1.10 有人知道为什么zmq_poll的投票失败了吗 #include <zmq/zmq.hpp> int main(int argc, char*

运行以下代码时,第一次调用
zmq_poll
(即返回
-1
)时出错。
zmq\u errno()
返回
128
zmr\u strerror(128)
调用返回
“未知错误”
。我已经使用C++的ZMQ了一段时间,现在没有任何问题,但是我不能得到一个调用<代码> ZMQYPopule,不管它多么简单。 调用
zmq::version
表明我正在使用zmq版本2.1.10

有人知道为什么zmq_poll的投票失败了吗

#include <zmq/zmq.hpp>

int main(int argc, char* argv[])
{
    zmq::context_t context(1);
    zmq::socket_t repA(context, ZMQ_REP);
    zmq::socket_t repB(context, ZMQ_REP);
    repA.bind("tcp://127.0.0.1:5555");
    repB.bind("tcp://127.0.0.1:5556");
    zmq::pollitem_t items[] =
    {
        { &repA, 0, ZMQ_POLLIN, 0 },
        { &repB, 0, ZMQ_POLLIN, 0 }
    };
    while (true)
    {
        int rc = zmq_poll(items, 2, 1000);
        if (rc < 0)
        {
            int code = zmq_errno(); //code = 128
            auto message = zmq_strerror(code); //message = "Unknown error"
        }
    }
}
#包括
int main(int argc,char*argv[])
{
zmq::context\u t context(1);
zmq::socket\u t repA(上下文,zmq\u REP);
zmq::socket\u t repB(上下文,zmq\u REP);
修复绑定(“tcp://127.0.0.1:5555");
代表绑定(“tcp://127.0.0.1:5556");
zmq::pollitem\u t items[]=
{
{&repA,0,ZMQ_POLLIN,0},
{&repB,0,ZMQ_POLLIN,0}
};
while(true)
{
int rc=zmq_民意测验(项目2,1000);
if(rc<0)
{
int code=zmq_errno();//code=128
自动消息=zmq_strerror(代码);//message=“未知错误”
}
}
}
要获得在zmq_pollitem_t结构中使用的ØMQ套接字,您应该将套接字类的实例强制转换为(void*)

应该如此

zmq::pollitem_t items[] =
{
    { repA, 0, ZMQ_POLLIN, 0 },
    { repB, 0, ZMQ_POLLIN, 0 }
};

没有
&

errno的值是多少?失败时,zmq_poll()应返回-1并将errno设置为以下定义的值之一@flup我现在看到,
zmq\u poll
不会直接返回错误号(它只是用
-1
发出信号),您必须调用
zmq\u errno()
才能真正获得错误号。完成此操作后,我得到了错误号
128
。(更新的问题)要获得在zmq_pollitem_t结构中使用的ØMQ套接字,您应该将套接字类的实例强制转换为(void*)。所以我怀疑你应该投出
repA
而不是发送它的地址。@flup谢谢,就这样了。果然,在
zmq::socket\u t
类上有一个重载强制转换到
void*
。请继续做一个回答,我将把它标记为答案。为了澄清这个非常古老的(但正确的)答案,<代码> ZMQ::SockKyt T <代码>是一个C++包,它围绕ZMQ套接字(这是一个代码> Value*/Cux>(参见))。代码> ZMQ::SokKyt t/代码>定义了<代码>操作符Value>(/>代码),以便它可以自然地使用。我认为这在C++的现代版本中是有缺陷的,我不得不应用一个手动的、旧的样式来限制它,使它在C++ 17下编译。