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 花了很多时间解释这个伟大的、智能的、可扩展的、非阻塞的消息传递库背后的概念思维。绝对值得花几个星期在他的文字上(不是代码片段,而是隐藏在那里的故事)。 确实是一本了不起的书。
我正在使用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 花了很多时间解释这个伟大的、智能的、可扩展的、非阻塞的消息传递库背后的概念思维。绝对值得花几个星期在他的文字上(不是代码片段,而是隐藏在那里的故事)。 确实是一本了不起的书。