Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用CZMQ-4.0.2新的zsock API创建发布/订阅体系结构?_C++_C_Zeromq - Fatal编程技术网

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

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),以避免内

我想使用CZMQ-4.0.2创建一个发布/订阅体系结构,但我无法理解如何使用新的
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;
}