是否可以将 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
套接字的预期行为吗?
答案 0 :(得分:1)
问题在于这一行:
sel[0].socket = ⊂
&
不应该在那里。将此更改为:
sel[0].socket = sub;
很难发现这个问题,因为该结构的socket
字段是void *
,这意味着类型检查器在任何一种情况下都不会抱怨。
答案 1 :(得分:0)
.poll()
端点ZMQ_PAIR
上sub
在 .connect()
.bind()
出现问题
API说明(强调添加):
使用带有
zmq_connect()
传输的inproc
将套接字连接到对等地址时,端点应被解释为标识要连接的名称的任意字符串。 在版本4.0之前,必须先通过将名称分配给与正在连接的套接字相同的ØMQ上下文中的至少一个套接字来创建名称。从版本4.0开始,zmq_bind()
和{{的顺序1}}就像tcp传输类型一样无关紧要。
zmq_connect()