我想使用CZMQ-4.0.2创建一个发布/订阅架构,但我无法理解如何使用新的zsock
API。
有人能告诉我一些使用新API的例子吗?
发布于 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
中添加一个前缀。@
表示绑定,>
连接。
zsock_t *sock = zsock_new_push("@ipc://test");
现在,要发送消息,您可以使用许多方法(zsock_send
、zmsg_send
、zstr_send
、zstr_sendx
、zstr_sendf
、zframe_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_send
与zsock_destroy
并排时,您的消息可能不会被传递。可以使用zsock_set_linger
或全局zsys_set_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;
}
用户示例
#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;
}
https://stackoverflow.com/questions/45005589
复制相似问题