首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用CZMQ-4.0.2新的zsock API创建发布/订阅体系结构?

如何使用CZMQ-4.0.2新的zsock API创建发布/订阅体系结构?
EN

Stack Overflow用户
提问于 2017-07-10 07:00:29
回答 1查看 3K关注 0票数 11

我想使用CZMQ-4.0.2创建一个发布/订阅架构,但我无法理解如何使用新的zsock API。

有人能告诉我一些使用新API的例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-26 22:20:10

tldr;

例子在网站的底部。

很少解释

我假设您要求的是特定于CZMQ的用法,而不是如何使用ZeroMQ套接字,以及PUB/SUB模式的特殊之处。

在使用CZMQ时,不需要担心上下文,它是在内部完成的。zsock_new函数族返回指向zsock_t的指针,这是套接字的不透明标识符。您需要记住在完成时调用zsock_destroy(&socket),以避免内存泄漏。

在大多数常见用法中,您不需要担心连接和绑定,因为zsock_new_XXX会处理这些问题。要知道采取了什么行动,您可以查看手册

//创建一个PUB套接字。默认操作为bind。CZMQ_EXPORT zsock_t * zsock_new_pub (const *终结点);//创建子套接字,并可选择订阅某些前缀字符串。默认//操作是连接。CZMQ_EXPORT zsock_t * zsock_new_sub (const *终结点,const *订阅);

如果您计划进行一些不寻常的绑定/连接,可以在endpoint中添加一个前缀。@表示绑定,>连接。

代码语言:javascript
运行
复制
zsock_t *sock = zsock_new_push("@ipc://test");

现在,要发送消息,您可以使用许多方法(zsock_sendzmsg_sendzstr_sendzstr_sendxzstr_sendfzframe_send),最通用的方法是zsock_send。它有打印样的原型,在那里你需要传递一张信息的图片。此字符串中的每个字符表示消息中的单个帧(或更多的帧,因为您还可以传递另一条消息)。这是用这里描述的

//向套接字(或参与者)发送“图片”消息。图片是一个//字符串,它定义了每个帧的类型。这使得在一次调用中发送//一个复杂的多帧消息变得容易。图片可以包含这些字符的任何//,每个字符对应于一个或两个参数:/i= int (签名) // 1= uint8_t // 2= uint16_t // 4= uint32_t // 8= uint64_t // s= char * // b=字节*,size_t (2个参数) // c= zchunk_t * // f= zframe_t * // h= zhashx_t * // U= zuuid_t * // p= void *(发送指针值,只有在inproc上有意义的( // m= zmsg_t *(发送zmsg中的所有帧) // z=发送零大小的帧(0参数) // u= uint (废弃)/注释,即s、b、c和f被以相同的方式编码,并且为发送方提供/选项是为了方便发送者,发送方可能已经或可能没有//拥有zero或zframe中的数据。不更改//任何参数的所有权。如果成功,返回0;如果发送失败,则返回-1。CZMQ_EXPORT int zsock_send (void *self,const char *zsock_send,.);

可能不清楚的是这个void *self,它实际上是我们从zsock_new返回的zsock_t *。在prototype中,它被声明为void *,因为这个函数也接受zactor_t *

重要:Does not change or take ownership of any arguments.。您需要在发送后释放/销毁数据。

接收看起来非常相似。它类似于sscanf,zsock_recv创建对象,因此,您同样需要处理内存。

ZeroMQ和CZMQ在行为上有很大的区别,这就是逗留套接字选项。对于ZeroMQ,它是无限的(-1),其中CZMQ的默认值为0(没有阻塞)。因此,无论何时,当您将zsock_sendzsock_destroy并排时,您的消息可能不会被传递。可以使用zsock_set_linger或全局zsys_set_linger为套接字单独设置Linger值。

出版商的例子

代码语言:javascript
运行
复制
#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;
}

用户示例

代码语言:javascript
运行
复制
#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;
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45005589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档