ZeroMQ轮询引发错误的原因:“0”;非套接字上的套接字操作“;? 我遇到了一个非常严重的奇怪问题,ZeloMQ及其C++绑定:每次在ZMQ套接字上执行轮询操作时,它会引发一个错误:

ZeroMQ轮询引发错误的原因:“0”;非套接字上的套接字操作“;? 我遇到了一个非常严重的奇怪问题,ZeloMQ及其C++绑定:每次在ZMQ套接字上执行轮询操作时,它会引发一个错误:,c++,zeromq,C++,Zeromq,非套接字上的套接字操作 下面是复制它的代码: #include <zmq.hpp> int main() { zmq::context_t ctx(1); zmq::socket_t sock1( ctx, ZMQ_REQ ); zmq::socket_t sock2( ctx, ZMQ_PUB ); sock1.bind( "tcp://*:10001" ); sock2.bind( "tcp://*:10002" ); zmq::poll

非套接字上的套接字操作

下面是复制它的代码:

#include <zmq.hpp>
int main() {

  zmq::context_t       ctx(1);
  zmq::socket_t sock1( ctx, ZMQ_REQ );
  zmq::socket_t sock2( ctx, ZMQ_PUB );

  sock1.bind( "tcp://*:10001" );
  sock2.bind( "tcp://*:10002" );

  zmq::pollitem_t* items = ( zmq::pollitem_t* ) malloc( 2 * sizeof( zmq::pollitem_t ) );

  items[0] = { &sock1, 0, ZMQ_POLLIN, 0 };
  items[1] = { &sock2, 0, ZMQ_POLLIN, 0 };

  while(1) {
    zmq::poll ( items, 2, 500 );  // Throws error !! socket operation on non-socket.
  }
}
#包括
int main(){
zmq::context_t ctx(1);
zmq::插座插座1(ctx,zmq要求);
zmq::socket_t sock2(ctx,zmq_PUB);
sock1.bind(“tcp://*:10001”);
sock2.bind(“tcp://*:10002”);
zmq::pollitem_t*items=(zmq::pollitem_t*)malloc(2*sizeof(zmq::pollitem_t));
项目[0]={&sock1,0,ZMQ_POLLIN,0};
项目[1]={&sock2,0,ZMQ_POLLIN,0};
而(1){
轮询(items,2500);//在非套接字上抛出错误!!套接字操作。
}
}

<0/COP> < P>给定的ZrOMQAPI/C++绑定文档建议这样做,一个人应该遵循以下的实践:

要获取用于
zmq\u pollitem\u t
结构的ØMQ套接字,您应该将
套接字\u t
类的实例强制转换为
(void*)


我一直认为这是C++绑定中的一个讨厌的小东西。它依赖于zmq::socket类中的第一个成员变量,即czmqsocket。如果您编辑zmq::socket\t的定义来更改成员变量的顺序,它会严重破坏内容。很高兴知道,感谢用户3666197的回答。虽然将对象强制转换为void*指针让我感觉很奇怪,而不是C风格的强制转换,但您可以显式地使用socket\u t::operator void*()