C++ 如何使用CZMQ-4.0.2新的zsock API创建发布/订阅体系结构?
我想使用CZMQ-4.0.2创建一个发布/订阅体系结构,但我无法理解如何使用新的C++ 如何使用CZMQ-4.0.2新的zsock API创建发布/订阅体系结构?,c++,c,zeromq,C++,C,Zeromq,我想使用CZMQ-4.0.2创建一个发布/订阅体系结构,但我无法理解如何使用新的zsockAPI 有人能给我举一些使用新API的例子吗?tldr; 很少解释 我假设您要求的是CZMQ的特定用法,而不是如何使用ZeroMQ套接字,以及发布/订阅模式的怪癖是什么 当使用CZMQ时,您不需要担心上下文,它是在内部完成的zsock\u newfunctions系列返回指向zsock\u t的指针,这是套接字的不透明标识符。您需要记住在完成后调用zsock\u destroy(&socket),以避免内
zsock
API
有人能给我举一些使用新API的例子吗?tldr;
很少解释
我假设您要求的是CZMQ的特定用法,而不是如何使用ZeroMQ套接字,以及发布/订阅模式的怪癖是什么
当使用CZMQ时,您不需要担心上下文,它是在内部完成的zsock\u new
functions系列返回指向zsock\u t
的指针,这是套接字的不透明标识符。您需要记住在完成后调用zsock\u destroy(&socket)
,以避免内存泄漏
在最常见的用法中,您不需要担心连接和绑定,因为zsock\u new\u XXX
会处理这个问题。要知道采取了什么行动,您可以查看
如果您计划执行一些不寻常的绑定/连接,可以向端点添加前缀<代码>@
表示绑定,
连接
zsock_t *sock = zsock_new_push("@ipc://test");
现在,要发送消息,你可以使用很多方法(zsock\u send
,zmsg\u send
,zstr\u send
,zstr\u send
,zframe\u send
),最通用的方法是zsock\u send
。它有一个类似printf的原型,您需要在其中传递消息的图片。此字符串中的每个字符表示消息中的单个帧(或多个帧,因为您还可以传递另一条消息)。其描述见:
一个可能不清楚的地方是这个void*self
,它实际上是我们从zsock\u new返回的zsock\u t*
。在prototype中,它被声明为void*
,因为此函数也接受zactor\u t*
重要提示:不会更改或拥有任何参数。
。发送后需要释放/销毁数据
他看起来很像。它类似于sscanf,并且zsock\u recv
创建对象,所以同样,您需要注意内存
ZeroMQ和CZMQ行为上的最大区别是LINGER套接字选项。对于ZeroMQ,它是无限的(-1),其中CZMQ的默认值为0(无阻塞)。因此,任何时候,当您让zsock\u发送
后接zsock\u销毁
时,您的邮件可能无法发送。可以通过使用zsock\u set\u Linger
或全局zsys\u set\u Linger
为套接字单独设置Linger值
出版商的例子
#include <czmq.h>
int main(int argc, char ** argv) {
zsock_t *socket = zsock_new_pub("ipc://example.sock");
assert(socket);
while(!zsys_interrupted) {
zsys_info("Publishing");
zsock_send(socket, "sss", "TOPIC", "MESSAGE PART", "ANOTHER");
zclock_sleep(1000);
}
zsock_destroy(&socket);
return 0;
}
#包括
int main(int argc,字符**argv){
zsock_t*socket=zsock_new_pub(“ipc://example.sock");
断言(套接字);
当(!zsys_中断){
zsys_信息(“发布”);
zsock_send(套接字、“sss”、“主题”、“消息部分”、“其他”);
zclock_睡眠(1000);
}
zsock_销毁(和插座);
返回0;
}
订户示例
#include <czmq.h>
int main(int argc, char ** argv) {
zsock_t *socket = zsock_new_sub("ipc://example.sock", "TOPIC");
assert(socket);
char *topic;
char *frame;
zmsg_t *msg;
int rc = zsock_recv(socket, "sm", &topic, &msg);
assert(rc == 0);
zsys_info("Recv on %s", topic);
while(frame = zmsg_popstr(msg)) {
zsys_info("> %s", frame);
free(frame);
}
free(topic);
zmsg_destroy(&msg);
zsock_destroy(&socket);
return 0;
}
#包括
int main(int argc,字符**argv){
zsock_t*套接字=zsock_new_sub(“ipc://example.sock“,”主题“);
断言(套接字);
字符*主题;
字符*帧;
zmsg_t*味精;
int rc=zsock_recv(套接字、sm、主题和消息);
断言(rc==0);
zsys_信息(“在%s上录制”,主题);
while(frame=zmsg_popstr(msg)){
zsys_信息(“>%s”,帧);
自由(帧);
}
免费(主题);
zmsg_销毁(&msg);
zsock_销毁(和插座);
返回0;
}
@ThirupathiThangavel:嗨,经过一些尝试和错误,我现在能够编写一些工作代码了。谢谢你的回复。如果你发布了一个描述你所做的事情的答案,你可以接受它,它甚至可能会帮助其他人。我也想看到这一点,我真的需要这个问题的答案^^
#include <czmq.h>
int main(int argc, char ** argv) {
zsock_t *socket = zsock_new_pub("ipc://example.sock");
assert(socket);
while(!zsys_interrupted) {
zsys_info("Publishing");
zsock_send(socket, "sss", "TOPIC", "MESSAGE PART", "ANOTHER");
zclock_sleep(1000);
}
zsock_destroy(&socket);
return 0;
}
#include <czmq.h>
int main(int argc, char ** argv) {
zsock_t *socket = zsock_new_sub("ipc://example.sock", "TOPIC");
assert(socket);
char *topic;
char *frame;
zmsg_t *msg;
int rc = zsock_recv(socket, "sm", &topic, &msg);
assert(rc == 0);
zsys_info("Recv on %s", topic);
while(frame = zmsg_popstr(msg)) {
zsys_info("> %s", frame);
free(frame);
}
free(topic);
zmsg_destroy(&msg);
zsock_destroy(&socket);
return 0;
}