C++ ZeroMQ 发布订阅模式例子跟注意事项

发布订阅模式

接收端:

void* context;
void* subscriber;

// 第一步:zmq_ctx_new 创建context对象
context = zmq_ctx_new();
// 第二步:创建socket,flag为ZMQ_SUB是订阅者
subscriber = zmq_socket(context, ZMQ_SUB);

// 第三步:zmq_setsockopt 设置socket连接参数
int reconnectTime = 10;
// ZMQ_RECONNECT_IVL 重连间隔 ZMQ_RECONNECT_IVL_MAX:设置重连间隔的最大值
int ret = zmq_setsockopt(subscriber_sub, ZMQ_RECONNECT_IVL, &reconnectTime, sizeof(reconnectTime));


// 设置连接心跳
int ivl = 5 * 1000;
int ttl = 2 * 60 * 1000;
int timeout = 5 * 1000;
zmq_setsockopt(subscriber_sub,ZMQ_HEARTBEAT_IVL, &ivl, sizeof(ivl)); // 心跳间隔
zmq_setsockopt(subscriber_sub,ZMQ_HEARTBEAT_TTL, &ttl, sizeof(ttl)); // 设置TTL值ZMTP心跳
zmq_setsockopt(subscriber_sub,ZMQ_HEARTBEAT_TIMEOUT, &timeout, sizeof(timeout));// 心跳超时
// 连接超时时间计算:ZMQ_HEARTBEAT_IVL + ZMQ_HEARTBEAT_TIMEOUT = ? seconds

// 第四步:连接
zmq_connect(subscriber, "tcp://localhost:10012");
zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "Quote", strlen("Quote"));  //允许订阅多个频道

void ZmqClient::subs() {
	char topic_name[256] = { 0 }; //用于接收订阅的主题名
	char payload[1024] = { 0 };   //用于接收订阅主题的内容
	while (1)
	{
		memset(topic_name, 0, sizeof(topic_name));
		memset(payload, 0, sizeof(payload));
		// zmq_recv 阻塞式接收,如果要设置接收或者发布者发送超时可以设zmq_setsockopt(subscriber_sub, ZMQ_RCVTIMEO, &timeout, sizeof(timeout));
		int size = zmq_recv(subscriber, topic_name, sizeof(topic_name), 0); //接收订阅的主题名称
		if (size == -1)
		{
			std::cout << "recv topic error!!" << std::endl;
			continue;
		}
		size = zmq_recv(subscriber, payload, sizeof(payload), 0); //接收订阅的消息
		if (size == -1)
		{
			std::cout << "recv payload error!!" << std::endl;
		}
		std::cout << topic_name << payload << std::endl;
	}
}

// 第五步:退出时调用
zmq_close(subscriber);   
zmq_ctx_destroy(context);

 

发送端:

void* context;
void* subscriber;

context = zmq_ctx_new();
publisher = zmq_socket(context, ZMQ_PUB);

// 绑定地址
std::string addr = "tcp://localhost:10012"
int result = zmq_bind(publisher, addr.data());//zmq_bind()执行成功会返回0。其它情况则返回-1并且设置errno

// 发送
zmq_send(publisher, "Quote", strlen("Quote"), ZMQ_SNDMORE); //指定要发布消息的主题
zmq_send(publisher, ptr.c_str(), strlen(ptr.c_str()), 0); //向设置的主题发布消息

// 退出时调用
zmq_close(publisher);		
zmq_ctx_destroy(context);

 

zmq_setsockopt 方法的参数设置:

 

ZMQ_RECONNECT_IVL:设置连接区间

的ZMQ_RECONNECT_IVL购股权为指定的套接字设置初始重新连接间隔。重新连接间隔是ØMQ在使用面向连接的传输时尝试重新连接断开的对等端之间等待的时间。

 

ZMQ_IMMEDIATE:将消息仅排队到已完成的连接

默认情况下,即使连接尚未完成,队列仍将填充传出连接。这可能导致带有循环路由的套接字上的“丢失”消息(REQ,PUSH,DEALER)。如果此选项设置为1,则消息只应排队等待完成的连接。如果没有其他连接,这将导致套接字阻塞,但会阻止队列填充等待连接的管道。

 

ZMQ_HEARTBEAT_IVL:发送ZMTP之间设置间隔心跳

将设置发送ZMTP心跳对指定的插槽之间的间隔。如果设置此选项并且大于0,则每隔ZMQ_HEARTBEAT_IVL毫秒发送一次PING ZMTP命令。

 

ZMQ_HEARTBEAT_TIMEOUT:为ZMTP设置超时心跳

将设置多长时间超时;发送PING命令ZMTP并没有收到任何流量后,连接之前要等待。此选项仅在ZMQ_HEARTBEAT_IVL也设置且大于0时有效。如果在发送PING命令后没有收到流量,但连接将超时,但接收的流量不必是PONG命令 - 任何接收到的流量将取消超时。

 

ZMQ_HEARTBEAT_TTL:设置TTL值ZMTP心跳

应当建立远程对等的超时ZMTP心跳。如果这个选项大于0,如果在TTL周期内没有收到更多的流量,远程端会超时。如果ZMQ_HEARTBEAT_IVL未设置或为0,则此选项不起作用。在内部,该值向下舍入到最接近的十分位,任何小于100的值都不起作用。

 

ZMQ_CONNECT_TIMEOUT:设置connect()超时

设置了多久时间,出connect()系统调用来等待。系统调用通常需要很长时间才会返回超时错误。设置此选项可让库在较早的时间间隔超时。

 

ZMQ_BACKLOG:未完成的连接

应设定为指定的套接字优秀的对等连接的队列的最大长度;这仅适用于面向连接的传输。有关详细信息,请参阅您的操作系统文档,以获取listen函数。

 

https://www.cnblogs.com/fengbohello/p/4230135.html

 

 ZMQ接口文档的官方网站 : http://api.zeromq.org/

 ZMQ接口文档的百度网盘下载地址(英文):http://pan.baidu.com/s/1jGDqXfS

 

● zmq - 0MQ 轻量级消息传输内核

● zmq_bind - 绑定一个socket

● zmq_close - 关闭ZMQ socket

● zmq_connect - 由一个socket创建一个对外连接

● zmq_ctx_destroy - 销毁一个ZMQ环境上下文

● zmq_ctx_get - 得到环境上下文的属性

● zmq_ctx_new – 创建一个新的ZMQ 环境上下文

● zmq_ctx_set - 设置环境上下文属性

● zmq_ctx_shutdown - 停止一个ZMQ context

● zmq_socket_monitor - 注册一个监控回调函数

● zmq_ctx_term - 终结一个ZMQ环境上下文

● zmq_curve – 安全的认证方式和保密方式

● zmq_curve_keypair - 生成一个新的CURVE 密钥对

● zmq_disconnect - 断开一个socket的连接

● zmq_errno – 返回errno的值给调用此函数的线程

● zmq_init - 初始化ZMQ环境上下文 (已弃用)

● zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码 

● zmq_z85_encode – 使用Z85算法对一个二进制秘钥进行加密,输出可打印的文本

● zmq_version – 返回ZMQ链接库的版本

● zmq_unbind - 停止连接外来的请求

● zmq_plain - 明文认证

● zmq_null - 无安全和加密

● zmq_msg_more - 指出是不是还有更多的消息部分可以接收

● zmq_msg_init - 初始化一个空的ZMQ消息结构

● zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据

● zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象

● zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面

● zmq_msg_copy - 把一个消息的内容复制到另一个消息中

● zmq_msg_data - 返回消息内容的指针

● zmq_msg_get - 获取消息的性质

● zmq_msg_set - 设置消息的性质

● zmq_msg_size - 以字节为单位返回消息内容的大小

● zmq_msg_recv - 从一个socket中接受一个消息帧

● zmq_msg_close – 释放一个ZMQ消息

● zmq_msg_send – 从一个socket发送一个消息帧

● zmq_term - 终结ZMQ环境上下文(context)(已弃用)

● zmq_strerror - 获取ZMQ错误描述字符串

● zmq_poll - I/O多路技术

● zmq_tcp – 使用TCP协议的ØMQ网络单播协议

● zmq_recv – 从一个socket上接收一个消息帧

● zmq_send – 在一个socket上发送一个消息帧

● zmq_proxy – 开始ZMQ内置代理

● zmq_recvmsg – 从一个socket上接收一个消息帧 (已弃用)

● zmq_sendmsg – 从一个socket上发送一个消息帧 (已弃用)

● zmq_ipc – ZMQ本地进程间通信传输协议

● zmq_proxy_steerable – 以STOP/RESUME/TERMINATE控制方式开启内置的ZMQ代理

● zmq_inproc – ØMQ 本地进程内(线程间)传输方式

● zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输

● zmq_send_const – 从一个socket上发送一个固定内存数据

● zmq_socket – 创建ZMQ套接字

● zmq_setsockopt –设置ZMQ socket的属性

● zmq_getsockopt – 获取ZMQ socket的属性

### 构建任务失败解决方案 当遇到 `Execution failed for task ':app:shrinkReleaseRes'` 错误时,这通常意味着资源压缩过程中出现了问题。此错误可能由多种原因引起,包括但不限于配置不正确、依赖冲突或特定于项目的其他因素。 #### 可能的原因分析 1. **ProGuard 或 R8 配置不当** ProGuard 和 R8 是用于优化和混淆代码以及减少 APK 大小的工具。如果这些工具的配置存在问题,可能会导致资源无法正常处理[^1]。 2. **重复资源** 如果项目中有多个模块定义了相同的资源名称,可能导致冲突并引发该错误。检查是否存在重名的 drawable、string 等资源文件[^2]。 3. **第三方库兼容性** 某些第三方库可能与当前使用的 Gradle 插件版本或其他库存在兼容性问题,从而影响到资源打包过程中的行为[^3]。 4. **Gradle 缓存问题** 有时旧缓存数据会干扰新编译的结果,尝试清理本地仓库和重新同步项目可以帮助排除此类潜在障碍[^4]。 #### 推荐的操作方法 为了有效解决问题,建议按照以下步骤逐一排查: ```bash # 清理项目构建目录 ./gradlew clean # 删除 .gradle 文件夹下的所有内容以清除缓存 rm -rf ~/.gradle/caches/ ``` 调整 `build.gradle` 中的相关设置也是一个重要环节: ```groovy android { ... buildTypes { release { minifyEnabled true // 是否启用代码缩减 shrinkResources true // 是否开启资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 尝试禁用 shrinkResources 来测试是否为资源压缩引起的错误 // shrinkResources false } } } ``` 此外,在 `proguard-rules.pro` 文件内添加必要的保留规则,防止关键类被意外移除: ```text -keep class com.example.yourpackage.** { *; } # 替换为你自己的包路径 -dontwarn androidx.**,com.google.** # 忽略警告信息 ``` 最后,确保所使用的 Android Studio 版本是最新的稳定版,并且已经应用了所有的补丁更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星点点-

请我喝杯咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值