猫智商排名zmq发布-订阅模式c++实现上⼀篇讲到zmq的安装及简单的请求-应答模式,本篇主要来看⼀下zmq的pub-sub代码如何实现。
发布-订阅模式的特点:
启功的字1.⼀个发布者可以被多个订阅者订阅,即发布者和订阅者是1:n的关系
2.当发布者数据内容发⽣变化时发布数据,所有订阅者均能及时收到数据。
发布者的代码:pub.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asrt.h>
#include <string.h>
#include "zmq.h"
激浊扬清的意思int main()
{
void* context = zmq_ctx_new();
asrt(context != NULL);
void* publisher = zmq_socket(context, ZMQ_PUB);
asrt(publisher != NULL);
int ret = zmq_bind(publisher, "tcp://*:5555");
asrt(ret == 0);
int i = 0;
while(1)
{
char szBuf[1024] = {0};
snprintf(szBuf, sizeof(szBuf), "rver i=%d", i);
printf("pub ctx: rver i = %d\n",i);
ret = zmq_nd(publisher, szBuf, strlen(szBuf) + 1, 0);
i++;关于植物的诗句
sleep(1);
}
zmq_clo (publisher);
zmq_ctx_destroy (context);
return 0;
}
订阅者的代码:sub.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asrt.h>
#include "zmq.h"
int main()
{
printf("Hello sub!\n");
void* context = zmq_ctx_new();
asrt(context != NULL);抱怨的意思是什么
void* subscriber = zmq_socket(context, ZMQ_SUB);
asrt(subscriber != NULL);
int ret = zmq_connect(subscriber, "tcp://localhost:5555");
asrt(ret == 0);
ret = zmq_tsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0);
asrt(ret == 0);
while(1)
园蛛{
printf("enter while to sub ctx\n");
char szBuf[1024] = {0};
ret = zmq_recv(subscriber, szBuf, sizeof(szBuf) - 1, 0);
if (ret > 0)
{
printf("%s\n", szBuf);
}
}
zmq_clo(subscriber);
zmq_ctx_destroy(context);
return 0;
}
特别注意:
1.我们在pub中bind,在sub中connect,在zmq的使⽤中⽆论是在pub还是sub中都可以bind,但是⼀般我们在pub中bind,在sub中connect 。反之sub端可能收不到消息
3.pub端不能使⽤recv函数,sub端不能使⽤nd函数
编译:
g++ -o sub sub.cpp -lzmq
g++ -o pub pub.cpp -lzmq公司合作协议>世界地理
运⾏:先运⾏pub可能会使订阅者错过部分发布内容,要想订阅完整的内容需要先启动sub,我这⾥启动两个sub