zmq_send与zmq_recv

zmq_send 简介:

zmq_send 是 ZeroMQ 库中用于发送消息的函数,函数原型如下:

int zmq_send(void *socket, const void *buf, size_t len, int flags);

参数说明:

  • socket:要发送消息的 Socket。
  • buf:要发送的消息内容的指针。
  • len:要发送的消息内容的长度。
  • flags:发送消息的选项,可以为以下常量的按位或:
    • ZMQ_NOBLOCK:非阻塞方式发送消息。
    • ZMQ_SNDMORE:指示当前消息为多个消息序列中的一个。

返回值:

  • 成功发送消息,返回发送的字节数。
  • 发送消息失败,返回-1,并设置 errno 为适当的错误码。

函数说明:

  • zmq_send 函数用于发送一条消息到指定的 Socket,可以是 ZMQ_REQZMQ_REPZMQ_PUBZMQ_SUB 等。
  • 消息内容 buf 可以是任意类型的数据,以字节数组的形式传递,len 参数表示消息内容的长度。
  • flags 参数可以控制发送消息的选项,常用的选项包括非阻塞方式发送和多个消息序列中的一个。
  • 当发送成功时,返回发送的字节数,如果消息的长度超过了套接字的缓冲区大小,可能会被截断。
  • 当发送失败时,返回-1,并设置 errno 为适当的错误码。可以通过 zmq_strerror(errno) 来获取对应错误码的错误信息。
  • 注意,zmq_send 函数是线程安全的,可以在多个线程中同时调用。
使用示例:
char *msg = "Hello, ZeroMQ!";
int rc = zmq_send(socket, msg, strlen(msg), 0);
if (rc == -1) {printf("发送消息失败:%s\n", zmq_strerror(errno));
}

在上述示例中,我们定义了一个要发送的消息内容 msg,并调用 zmq_send 函数发送消息。如果发送失败,可以通过 zmq_strerror(errno) 打印错误信息。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zmq.h>int main() {void *context = zmq_ctx_new();  // 创建一个ZeroMQ上下文void *socket = zmq_socket(context, ZMQ_REQ);  // 创建一个REQuest类型的Socketint rc = zmq_connect(socket, "tcp://localhost:5555");  // 连接到服务器端的地址和端口if (rc != 0) {printf("连接失败:%s\n", zmq_strerror(errno));zmq_close(socket);zmq_ctx_destroy(context);return -1;}char *msg = "Hello, ZeroMQ!";rc = zmq_send(socket, msg, strlen(msg), 0);  // 发送消息if (rc == -1) {printf("发送消息失败:%s\n", zmq_strerror(errno));zmq_close(socket);zmq_ctx_destroy(context);return -1;}printf("成功发送消息: %s\n", msg);zmq_close(socket);  // 关闭Socketzmq_ctx_destroy(context);  // 销毁ZeroMQ上下文return 0;
}

解析:

  1. 我们创建了一个 ZeroMQ 上下文 context,它可以看作是一个容器,用于保存 ZeroMQ 运行时的状态信息。

  2. 通过调用 zmq_socket 函数创建了一个 Socket。这个 Socket 类型是 ZMQ_REQ,即请求-应答模式。

  3. 通过调用 zmq_connect 函数来连接到服务器端的地址和端口。这里我们使用的是 TCP 协议,并传入 tcp://localhost:5555 作为连接地址。

  4. 如果连接失败,将会打印错误信息,并调用 zmq_close 关闭 Socket,然后调用 zmq_ctx_destroy 函数销毁上下文,并返回 -1。

  5. 然后,我们构造了要发送的消息内容 msg,并调用 zmq_send 函数来发送消息。这里我们传入了Socket、消息内容 msg,以及消息的长度,最后一个参数为0表示无特殊选项。

  6. 如果发送消息失败,将会打印错误信息,并调用 zmq_close 关闭 Socket,然后调用 zmq_ctx_destroy 函数销毁上下文,并返回 -1。

  7. 如果成功发送消息,将会打印成功发送的消息内容。

  8. 最后,我们调用 zmq_close 关闭 Socket,然后调用 zmq_ctx_destroy 函数销毁上下文。

zmq_recv 简介:

zmq_recv 是 ZeroMQ 库中用于接收消息的函数,函数原型如下:

int zmq_recv(void *socket, void *buf, size_t len, int flags);

参数说明:

  • socket:要接收消息的 Socket。
  • buf:用于存储接收到的消息内容的缓冲区指针。
  • len:缓冲区的大小,即要接收的消息内容的最大长度。
  • flags:接收消息的选项,可以为以下常量的按位或:
    • ZMQ_NOBLOCK:非阻塞方式接收消息。

返回值:

  • 成功接收消息,返回接收到的字节数。
  • 接收消息失败,返回-1,并设置 errno 为适当的错误码。

函数说明:

  • zmq_recv 函数用于从指定的 Socket 接收一条消息,可以是 ZMQ_REQZMQ_REPZMQ_PUBZMQ_SUB 等。
  • 接收到的消息内容将存储在 buf 指向的缓冲区内,len 参数表示缓冲区的大小,即要接收的消息内容的最大长度。
  • flags 参数可以控制接收消息的选项,常用的选项包括非阻塞方式接收。
  • 当接收到消息时,返回接收到的字节数,如果消息的长度超过了缓冲区的大小,可能会被截断。
  • 当接收失败时,返回-1,并设置 errno 为适当的错误码。可以通过 zmq_strerror(errno) 来获取对应错误码的错误信息。
  • 注意,zmq_recv 函数是线程安全的,可以在多个线程中同时调用。

使用示例:

char buf[1024];
int rc = zmq_recv(socket, buf, sizeof(buf), 0);
if (rc == -1) {printf("接收消息失败:%s\n", zmq_strerror(errno));
} else {printf("接收到的消息:%s\n", buf);
}

在上述示例中,我们定义了一个用于存储接收到的消息内容的缓冲区 buf,并调用 zmq_recv 函数接收消息。如果接收失败,可以通过 zmq_strerror(errno) 打印错误信息。如果接收成功,可以通过 buf 获取接收到的消息内容。

示例代码

示例代码:

#include <zmq.h>
#include <stdio.h>
#include <string.h>int main()
{void* ctx = zmq_ctx_new();  // 创建一个新的ZeroMQ上下文void* sock = zmq_socket(ctx, ZMQ_REP);  // 创建一个Reply类型的socketint rc = zmq_bind(sock, "tcp://*:5555");  // 绑定socket到本地5555端口if (rc != 0){printf("Socket binding failed\n");return -1;}char buffer[256];while (1){zmq_recv(sock, buffer, sizeof(buffer)-1, 0);  // 接收消息printf("Received message: %s\n", buffer);strcpy(buffer, "World");  // 准备回复消息zmq_send(sock, buffer, strlen(buffer), 0);  // 发送回复消息}zmq_close(sock);  // 关闭socketzmq_ctx_destroy(ctx);  // 销毁ZeroMQ上下文return 0;
}

解析:

  1. 首先,我们需要在代码中包含zmq.h头文件,这是ZeroMQ的C语言API头文件。
  2. zmq_ctx_new()函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。
  3. zmq_socket()函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP类型,即Reply类型的socket。
  4. zmq_bind()函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。
  5. 创建一个字符数组buffer,用于存储接收和发送的消息。
  6. 进入无限循环,等待接收和发送消息。
  7. zmq_recv()函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。
  8. 使用strcpy()函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。
  9. zmq_send()函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。
  10. 循环回到第6步,继续等待接收和发送消息。
  11. 最后,使用zmq_close()函数关闭socket对象,并使用zmq_ctx_destroy()函数销毁ZeroMQ上下文,释放所有相关资源。

这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。示例代码:

#include <zmq.h>
#include <stdio.h>
#include <string.h>int main()
{void* ctx = zmq_ctx_new();  // 创建一个新的ZeroMQ上下文void* sock = zmq_socket(ctx, ZMQ_REP);  // 创建一个Reply类型的socketint rc = zmq_bind(sock, "tcp://*:5555");  // 绑定socket到本地5555端口if (rc != 0){printf("Socket binding failed\n");return -1;}char buffer[256];while (1){zmq_recv(sock, buffer, sizeof(buffer)-1, 0);  // 接收消息printf("Received message: %s\n", buffer);strcpy(buffer, "World");  // 准备回复消息zmq_send(sock, buffer, strlen(buffer), 0);  // 发送回复消息}zmq_close(sock);  // 关闭socketzmq_ctx_destroy(ctx);  // 销毁ZeroMQ上下文return 0;
}

解析:

  1. 首先,我们需要在代码中包含zmq.h头文件,这是ZeroMQ的C语言API头文件。
  2. zmq_ctx_new()函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。
  3. zmq_socket()函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP类型,即Reply类型的socket。
  4. zmq_bind()函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。
  5. 创建一个字符数组buffer,用于存储接收和发送的消息。
  6. 进入无限循环,等待接收和发送消息。
  7. zmq_recv()函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。
  8. 使用strcpy()函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。
  9. zmq_send()函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。
  10. 循环回到第6步,继续等待接收和发送消息。
  11. 最后,使用zmq_close()函数关闭socket对象,并使用zmq_ctx_destroy()函数销毁ZeroMQ上下文,释放所有相关资源。

这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s实践(14)--scheduler调度器和pod调度策略

一、scheduler调度器 1、kube-scheduler简介 k8s实践(10) -- Kubernetes集群运行原理详解 介绍过kube-scheduler。 kube-scheduler是运行在master节点上&#xff0c;其主要作用是负责资源的调度&#xff08;Pod调度&#xff09;&#xff0c;通过API Server的Watch接口监听新建…

Google和百度搜索引擎常用语法及其说明

Google和百度搜索引擎常用语法及其说明 语法Google搜索说明搜索词例如&#xff1a;Python 教程基本搜索&#xff0c;返回包含指定关键词的结果。“短语搜索”“Python 教程”返回包含完整短语的结果&#xff0c;确切匹配搜索词。ANDPython AND 教程返回同时包含两个关键词的结…

three.js实现信号波效果

three.js实现信号波效果 图例 步骤 创建平面&#xff0c;添加贴图&#xff0c;平移几何体缩放 代码 <template><div class"app"><div ref"canvesRef" class"canvas-wrap"></div></div> </template><…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…

AirSim 的 ROS 功能包测试

参考链接&#xff1a; Ubuntu18.04搭建AirSimROS仿真环境_airsim ros-CSDN博客 ROS: AirSim ROS Wrapper - AirSim 1.编译 ros 包&#xff08;必须是 gcc-8&#xff09; 如果您的默认 GCC 不是 8 或更高&#xff08;使用 gcc --version 检查&#xff09;&#xff0c;那么编译…

vue element plus DatePicker 日期选择器

用于选择或输入日期 TIP 在 SSR 场景下&#xff0c;您需要将组件包裹在 <client-only></client-only> 之中 (如: Nuxt) 和 SSG (e.g: VitePress). 选择某一天# 以”日“为基本单位&#xff0c;基础的日期选择控件 基本单位由 type 属性指定。 通过 shortcuts 配…

软件测试|Python urllib3库使用指南

简介 当涉及到进行网络请求和处理HTTP相关任务时&#xff0c;Python的urllib3库是一个强大且灵活的选择。它提供了一种简单的方式来执行HTTP请求、处理响应和处理连接池&#xff0c;使得与Web服务进行交互变得更加容易。本文将详细介绍如何使用urllib3库进行网络请求。 安装u…

java.net.ConnectException: Connection refused: connect已解决

&#x1f95a;今日鸡汤&#x1f95a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 —— 《枫》 遇见问题莫着急&#xff0c;着急也没用~&#x1f636;‍&#x1f32b;️ 目录 &#x1f9c2;1.令人发麻的问题 &am…

python深度学习搭环境技巧

1、使用-t做不同项目的环境隔离 pip intall xxx -t /path/env1 公共环境放一个路径&#xff0c;其他放单独路径&#xff0c;可以完美隔离 训练时通过export PYTHONPATH/path/env1:$PYTHONPATH来调整 2、安装包&#xff0c;因为依赖导致失败 加上参数–no-deps, 不按照依赖 有…

vagrant 用户名密码登录

正常登录后 sudo -i 切换到root权限 vim /etc/ssh/vim sshd_config 将PasswordAuthentication no设置 为yes 重启sshd.service服务 systemctl restart sshd.service

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架&#xff0c;它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化&#xff0c;它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例&#xff0c;从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

MT36291 2.5A 高效的1.2MHz电流模式升压转换器 DCDC管理芯片 航天民芯

描述 MT36291是一个恒定频率、6引脚SOT23电流模式升压转换器&#xff0c;旨在用于小型、低功耗的应用。MT36291的开关频率为1.2MHz&#xff0c;并允许使用2mm或更低高度的微小、低成本的电容器和电感器。内部软启动导致注入电流小&#xff0c;延长电池寿命。MT36291的特点是在光…

二线厂商-线上测评-大数据开发

曾经投递过一些中级岗位&#xff0c;在面试之前&#xff0c;会通过邮件的方式把性格测试的题目发给你让你做一下。 一般分为单选题&#xff0c;多选题&#xff0c;性格测试题&#xff0c;认知理解题等等。 大概做了一个小时吧。 单选题&#xff1a; 感觉就是类似于以前高中时候…

golang实现加密解密文档

golang实现加密解密文档 package mainimport ("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""flag""fmt""io""io/ioutil" )func main() {encodePtr : flag.…

中小企业实施了MES系统后,同样具备大企业的生产能力

工业4.0、智能制造是当前制造业最热门的话题。数字化工厂是实现智能制造的基础&#xff0c;在建设数字化工厂的过程中&#xff0c;MES系统是核心也是最重要的一环。万界星空MES系统是企业信息数据集成的纽带&#xff0c;可帮助企业实现监控与实际生产过程的同步化&#xff0c;全…

2024--Django平台开发-Django知识点(三)

day03 django知识点 项目相关路由相关 urls.py视图相关 views.py模版相关 templates资源相关 static/media 1.项目相关 新项目 开发时&#xff0c;可能遇到使用其他的版本。虚拟环境 老项目 打开项目虚拟环境 1.1 关于新项目 1.系统解释器命令行【学习】 C:/python38- p…

BUUCTF ---> Encrypto

转眼就一月十号了&#xff0c;本来今天不想更的&#xff0c;&#xff08;因为我懒&#xff09;是因为明天要考python&#xff0c;好像还不止 但是呢&#xff0c;发现BUUCTF的密码学模块刚好可以用到py的脚本&#xff0c;那就当时复习一下吧&#xff01;&#xff01; 这里就要介…

【Oracle】查看表空间使用率sql

10G进asm 直接su - oracle 然后asmcmd 11G进asm,需要su - grid 然后asmcmd 1.切换到相关oracle数据库实例下: echo $ORACLE_SID 查看当前数据库实例 或者进入sql下执行 select instance_name from V$instance; export ORACLE_SID=sohdb1 切换到sohdb1数据库实例下…

您的计算机已被.LIVE勒索病毒感染?恢复您的数据的方法在这里!

引言&#xff1a; 在数字时代&#xff0c;.LIVE勒索病毒如暗夜中的黑暗调&#xff0c;威胁着个人和企业的数字安全。本文将深入介绍.LIVE勒索病毒的特征&#xff0c;提供解密数据的方法&#xff0c;并讨论预防措施&#xff0c;让我们共同筑起数字世界的防护之墙。数据的重要性…

系列三十六、注解版Spring、SpringMVC配置文件

一、注解版Spring、SpringMVC配置文件 1.1、pom <dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version><…