C++ zeroMQ:zmq#u recv()不';行不通
我正在使用zeroMQ实现send recv消息。我使用这种模式:PUB-SUB。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
然而,似乎我可以从发布者那里发送一些消息,但无法从订阅者那里接收。这是我的代码:
//订户:
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的一本优秀书籍中受益匪浅--“代码连接”