当前位置: 首页 > news >正文

分享zframe_send使用过程中 的一个小问题

zframe_send函数中,第一个参数是一个指向zframe_t指针的指针。这是因为在发送帧之后,该函数会销毁帧并将你的指针设置为NULL。这样做是为了防止你再次使用已经被销毁的帧。

所以,如果你的发送数据后续还要使用,可以使用zframe_dup函数处理这种情况。 你需要创建一个新的zframe_t指针,并将sendData的内容复制到这个新的帧中,然后发送这个新的帧。

这是一个可能的解决方案:

void messageListeningProcessingBranch(zsock_t *sDataSock, const zframe_t &sendData)
{zframe_t *frame = zframe_dup(&sendData);  // 创建一个新的帧并复制sendData的内容zframe_send(&frame, sDataSock, 0);  // 发送新的帧
}

在这个函数中,zframe_dup函数会创建一个新的zframe_t对象,并将sendData的内容复制到这个新的对象中。然后,zframe_send函数会发送这个新的帧,并在发送之后销毁它。

附赠一些相关函数的介绍。
使用ZeroMQ库中的zframe模块进行消息的接收和发送。下面是相关函数的使用介绍:

  1. zframe_recv(responder): 这个函数用于从指定的套接字(在这里是responder)接收一个帧。如果接收成功,它将返回一个新的zframe_t对象,否则返回NULL。这个函数会阻塞,直到有一个帧可以接收。

  2. zframe_strdup(frame_recv): 这个函数用于复制一个帧的数据并将其作为一个新的字符串返回。这个字符串需要在使用完毕后通过free()函数释放。

  3. zframe_size(frame_recv): 这个函数用于获取一个帧的大小,以字节为单位。

  4. zsys_info("Received: %s", message): 这个函数用于打印信息。在这里,它被用来打印接收到的消息。

  5. zframe_send(&frame_recv, responder, 0): 这个函数用于将一个帧发送到指定的套接字(在这里是responder)。第三个参数是一个标志,用于指定发送的方式。在这里,它被设置为0,表示这个函数在发送帧后不会销毁它。如果发送成功,这个函数将返回0,否则返回-1。

  6. free(message): 这个函数用于释放之前通过zframe_strdup()函数复制的字符串。

以上代码的组合使用的一个实例如下

zframe_t *frame_recv = zframe_recv(responder);//responder 是创建的接收套接字
if (frame_recv)
{char *message = zframe_strdup(frame_recv);print_hex(message, zframe_size(frame_recv));zsys_info("Received: %s", message);zframe_send(&frame_recv, responder, 0);  // 直接转发接收到的消息free(message);  // 释放复制的字符串
}

分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

相关文章:

  • React Native自学笔记
  • 为什么大家会选择通配符SSL证书?
  • 线性表(顺序表,单链表,双链表,循环链表,静态链表)
  • Linux中命令lsattr/chattr
  • react_6
  • 全面的Docker快速入门教程
  • U盘显示无媒体怎么办?方法很简单
  • 在校园跑腿系统小程序中,如何设计高效的实时通知与消息推送系统?
  • ARCGIS---dem生成高程点
  • 最近又考了两个Oracle认证,交一下作业
  • LV.12 D17 中断控制器 学习笔记
  • 前端的几种网络请求方式
  • 内涝积水监测仪怎么样?万宾科技城市内涝积水监测的作用
  • ZZ038 物联网应用与服务赛题第J套
  • 为什么是LangChain?
  • 4. 路由到控制器 - Laravel从零开始教程
  •  D - 粉碎叛乱F - 其他起义
  • iOS 颜色设置看我就够了
  • JavaScript函数式编程(一)
  • Linux下的乱码问题
  • MaxCompute访问TableStore(OTS) 数据
  • mysql 5.6 原生Online DDL解析
  • Python打包系统简单入门
  • python学习笔记 - ThreadLocal
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • spring-boot List转Page
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分类模型——Logistics Regression
  • 简单实现一个textarea自适应高度
  • 开源SQL-on-Hadoop系统一览
  • 前端自动化解决方案
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • Python 之网络式编程
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 移动端高清、多屏适配方案
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (数据结构)顺序表的定义
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 垃圾回收机制原理(二)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET关于 跳过SSL中遇到的问题
  • .NET企业级应用架构设计系列之技术选型