是否可以在ZMQ_PAIR套接字原型上使用zmq :: poll()?

时间:2017-06-12 22:21:38

标签: zeromq

是否可以将 zmq::poll ZMQ_PAIR 类型的套接字一起使用?我有以下代码:

zmq::context_t ctx;

// create an in-process publisher for testing purposes
zmq::socket_t pub( ctx, ZMQ_PAIR );
pub.connect( "inproc://SelectTest_oneMessage" );
SendString( pub, "test-message" );

// create an in-process subscriber for testing purposes
zmq::socket_t sub( ctx, ZMQ_PAIR );
sub.bind( "inproc://SelectTest_oneMessage" );

zmq::pollitem_t sel[1];
sel[0].socket = ⊂
sel[0].events = ZMQ_POLLIN;

int rc = zmq::poll( sel, 1, -1 );
ASSERT_TRUE( sel[0].revents & ZMQ_POLLIN );

zmq::message_t msg;
ASSERT_NE( sub.recv( &msg ), 0 );
ASSERT_NE( sub.recv( &msg ), 0 );

但对zmq::poll的调用失败,但有例外:

  

Socket operation on non-socket

我在这里做错了什么?或者这是ZMQ_PAIR套接字的预期行为吗?

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

sel[0].socket = ⊂

&不应该在那里。将此更改为:

后,代码可以正常工作
sel[0].socket = sub;

很难发现这个问题,因为该结构的socket字段是void *,这意味着类型检查器在任何一种情况下都不会抱怨。

答案 1 :(得分:0)

不,禁止在.poll()端点ZMQ_PAIRsub

.connect()

之前 .bind() 出现问题

API说明(强调添加)

  

使用带有 zmq_connect() 传输的inproc将套接字连接到对等地址时,端点应被解释为标识要连接的名称的任意字符串。 在版本4.0之前,必须先通过将名称分配给与正在连接的套接字相同的ØMQ上下文中的至少一个套接字来创建名称。从版本4.0开始,zmq_bind()和{{的顺序1}}就像tcp传输类型一样无关紧要。

抓住狗被埋的确切位置:

zmq_connect()