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下编译。