C++ zeroMQ:zmq#u recv()不';行不通

C++ zeroMQ:zmq#u recv()不';行不通,c++,zeromq,recv,C++,Zeromq,Recv,我正在使用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

我正在使用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*subscriber=zmq_套接字(上下文,zmq_SUB);
zmq_connect(订户,“tcp://127.0.0.1:5556”);
常数int SIZE=20;
字符信息[大小];
cout

说:

发布者无法判断订阅服务器何时成功连接,无论是在初始连接时还是在网络故障后重新连接时

这里的要点是,首先启动您的发布服务器,将其消息发送到空中,并尽可能快地发送到您的硬件

同时,您的订户失败,因为您的URL包含一个
太多,或者其他内容:

zmq_connect(subscriber, "tcp:://127.0.0.1:5556");
因此,你要做的是:无限多的消息没有发送到任何地方,失败的订阅者没有告诉你它失败了,发布者没有注意到接收端没有成功连接。

说:

发布者无法判断订阅服务器何时成功连接,无论是在初始连接时还是在网络故障后重新连接时

这里的要点是,首先启动您的发布服务器,将其消息发送到空中,并尽可能快地发送到您的硬件

同时,您的订户失败,因为您的URL包含一个
太多,或者其他内容:

zmq_connect(subscriber, "tcp:://127.0.0.1:5556");
因此,你要做的是:无限多的消息没有发送到任何地方,失败的订阅者没有告诉你它失败了,发布者没有注意到接收端没有成功连接。

说:

发布者无法判断订阅服务器何时成功连接,无论是在初始连接时还是在网络故障后重新连接时

这里的要点是,首先启动您的发布服务器,将其消息发送到空中,并尽可能快地发送到您的硬件

同时,您的订户失败,因为您的URL包含一个
太多,或者其他内容:

zmq_connect(subscriber, "tcp:://127.0.0.1:5556");
因此,你要做的是:无限多的消息没有发送到任何地方,失败的订阅者没有告诉你它失败了,发布者没有注意到接收端没有成功连接。

说:

发布者无法判断订阅服务器何时成功连接,无论是在初始连接时还是在网络故障后重新连接时

这里的要点是,首先启动您的发布服务器,将其消息发送到空中,并尽可能快地发送到您的硬件

同时,您的订户失败,因为您的URL包含一个
太多,或者其他内容:

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

因此,你就这样做了:无限多的消息没有发送出去,失败的订阅者没有告诉你它失败了,发布者没有注意到接收端没有成功连接。

对于发布-订阅模式,我们必须使用
setsockopt
为订阅者设置一个过滤器。否则,订阅者无法重新连接接收任何消息。因此,对于这种情况,我们应该做的是在
zmq\u recv
之前为订户添加以下代码:
zmq_setsockopt(订阅者,zmq_SUBSCRIBE,“你好”,strlen(“你好”))

对于发布-订阅模式,我们必须使用
setsockopt
为订户设置筛选器。否则,订户无法接收任何消息。因此,对于这种情况,我们应该在
zmq\u recv
之前为订户添加以下代码:
zmq_setsockopt(订阅者,zmq_SUBSCRIBE,“你好”,strlen(“你好”))

对于发布-订阅模式,我们必须使用
setsockopt
为订户设置筛选器。否则,订户无法接收任何消息。因此,对于这种情况,我们应该在
zmq\u recv
之前为订户添加以下代码:
zmq_setsockopt(订阅者,zmq_SUBSCRIBE,“你好”,strlen(“你好”))

对于发布-订阅模式,我们必须使用
setsockopt
为订户设置筛选器。否则,订户无法接收任何消息。因此,对于这种情况,我们应该在
zmq\u recv
之前为订户添加以下代码:
zmq\u setsockopt(订阅者,zmq\u SUBSCRIBE,“你好”,strlen(“你好”);

A:ZeroMQ可以工作。 你的代码还可以, 虽然您在
PUB-SUB
设计中错过了一个概念上重要的一点 是的,ZeroMQ工作得很好。 是的,您的代码没有问题,所以问题出在哪里?

PUB-SUB
正式通信模式的设计使得
PUB
/publisher端仅将每条消息分发给那些
SUB
/subscriber端,他们将自己呈现给了
PUB
他们的个人希望收到一些东西。这是通过所谓的订阅来实现的(在我们的人类世界中,这是很自然的——你没有收到任何你没有订阅的报纸,你可能会收到一些报纸,你已经收到了)

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

假设“新”-
子项
未(隐式)订阅任何内容

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

任何
SUB
都可以订阅接收“一切”

因此,您的代码是按照声明的方式运行的-都是在
PUB
端(不向活动
SUB
端发送任何内容,它还没有呈现任何接收内容的意愿,因此根本没有接收任何内容,仍然处于[阻塞]等待状态)

Nota bene:您可能会从Pieter HINTJENS的一本优秀书籍中受益匪浅--“代码连接”