zeroMQ:zmq_recv() 不起作用

zeroMQ: zmq_recv() doesn't work

我正在使用zeroMQ实现send-recv消息。我使用这种模式:PUB-SUB。
但是,似乎我可以从发布者发送一些消息,但我无法从订阅者那里接收到它。这是我的代码:

//订阅者:

int main(int argc, char** argv){
    void * context = zmq_ctx_new();
    void * subscriber = zmq_socket(context, ZMQ_SUB);
    zmq_connect(subscriber, "tcp:://127.0.0.1:5556");
    const int SIZE = 20;
    char msg[SIZE];
    cout<<"receiving..."<<endl;
    cout<<zmq_recv(subscriber, msg, SIZE, 0)<<endl;
    cout<<"received";
    zmq_close(subscriber);
    zmq_ctx_destroy(context);
    return 0;
}

//出版商:

int main(int argc, char** argv){
    void * context = zmq_ctx_new();
    void * publisher = zmq_socket(context, ZMQ_PUB);
    zmq_bind(publisher, "tcp://127.0.0.1:5556");
    srandom((unsigned)time(NULL));
    char updateMsg[20] = "hello world";
    while(1)
    {
        cin.get();
        cout<<"sending..."<<endl;
        cout<<zmq_send(publisher, updateMsg, 20, 0)<<endl;
        cout<<"sent"<<endl;
    }
    zmq_close(publisher);
    zmq_ctx_destroy(context);
    return 0;
}

现在,我 运行 发布者然后我 运行 订阅者。
然后我在发布者那里输入 "Enter",它说:

sending...
20
sent<l

但是,在订阅者处,它总是只显示这一行:receiving...
zmq_recv()好像被屏蔽了

你能帮帮我吗?

http://zguide.zeromq.org/php:chapter5#Pros-and-Cons-of-Pub-Sub

说:

Publishers can't tell when subscribers are successfully connected, both on initial connections, and on reconnections after network failures.

这里的重点是您的发布者首先启动,将其消息尽快发送到您的硬件。

与此同时,您的订阅者失败了,因为您的 URL 包含一个 : 太多,或者其他原因:

zmq_connect(subscriber, "tcp:://127.0.0.1:5556");

所以你走了:无限量的消息无处发送,失败的订阅者没有告诉你失败,以及发布者没有注意到接收端没有成功连接。

对于 PUB-SUB 模式,我们必须使用 setsockopt 为订阅者设置过滤器。否则,订阅者将无法收到任何消息。那么对于这种情况,我们应该做的就是在zmq_recv之前为订阅者添加如下代码: zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "hello", strlen("hello"));

答:ZeroMQ 确实有效。

你的代码没问题,

虽然您错过了 PUB-SUB 设计中概念上重要的一点

是的,ZeroMQ 确实运行良好。 是的,你的代码没问题,所以问题出在哪里?

PUB-SUB正式通信模式的设计使得PUB/发布者端分发每个每条消息只发给那些 SUB/订阅方,他们已经向 PUB 展示了自己 愿意接收 的东西。这是通过所谓的订阅完成的(在我们的人类世界中很自然——你不会收到任何你没有订阅的报纸,你可能会收到一些报纸,你已经订阅了)。

ZeroMQ 设计反映了这种自然模式。

“新”-SUB 被假定为未(隐式)订阅任何内容。

任何 SUB 都可以订阅以仅接收满足指定“订阅”的消息。

任何 SUB 都可以订阅以接收“所有内容”。

所以你的代码是 运行 声明的 - 都在 PUB 方面(没有向活动的 SUB 方面发送任何东西,只是还没有提出任何接收东西的意愿,因此什么也得不到,仍然处于 [阻塞] 等待状态。

注意事项:您可能会从 Pieter HINTJENS 的一本优秀书籍中获益良多 -- “Code Connected,第 1 卷”(提供 PDF 格式),其中 Pieter 花了很多时间解释这个伟大的、智能的、可扩展的、非阻塞的消息传递库背后的概念思维。绝对值得花几个星期在他的文字上(不是代码片段,而是隐藏在那里的故事)。 确实是一本了不起的书。