ZMQ请求应答模型

news2024/12/29 2:25:31

案例一

这个案例的出处是ZMQ的官网。请求段发送Hello,应答端回复World。
ZMQ

Request(client)

#include <string>
#include <iostream>
#include <zmq.hpp>

using namespace std;
using namespace zmq; // 使用 zmq 命名空间

int main()
{
    // initialize the zmq context with a single IO thread
    context_t context{1};

    // construct a REQ (request) socket and connect to interface
    socket_t socket{context, socket_type::req};
    socket.connect("tcp://localhost:5555");

    // set up some static data to send
    const string data{"Hello"};

    for (auto request_num = 0; request_num < 10; ++request_num) 
    {
        // send the request message
        cout << "Sending Hello " << request_num << "..." << endl;
        socket.send(buffer(data), send_flags::none);
        
        // wait for reply from server
        message_t reply{};
        socket.recv(reply, recv_flags::none);

        cout << "Received " << reply.to_string(); 
        cout << " (" << request_num << ")";
        cout << endl;
    }

    return 0;
}

Reply(server)

#include <string>
#include <chrono>
#include <thread>
#include <iostream>

#include <zmq.hpp>

int main() 
{
    using namespace std::chrono_literals;

    // initialize the zmq context with a single IO thread
    zmq::context_t context{1};

    // construct a REP (reply) socket and bind to interface
    zmq::socket_t socket{context, zmq::socket_type::rep};
    socket.bind("tcp://*:5555");

    // prepare some static data for responses
    const std::string data{"World"};

    for (;;) 
    {
        zmq::message_t request;

        // receive a request from client
        socket.recv(request, zmq::recv_flags::none);
        std::cout << "Received " << request.to_string() << std::endl;

        // simulate work
        std::this_thread::sleep_for(1s);

        // send the reply to the client
        socket.send(zmq::buffer(data), zmq::send_flags::none);
    }

    return 0;
}

编译

g++ -o server server.cpp `pkg-config --cflags --libs libzmq`
g++ -o client client.cpp `pkg-config --cflags --libs libzmq`

在这里插入图片描述

请求应答步骤

请求端

建立与应答端的连接

第一步:创建ZMQ上下文
context_t context{1};

创建一个 ZeroMQ 上下文(context),并初始化为只有一个 I/O 线程。context_t 是 ZeroMQ 库中用于管理套接字的类。

第二步:创建一个请求套接字
socket_t socket{context, socket_type::req}

在上下文中创建一个套接字(socket),并指定其类型为 req(请求者)。这意味着这个套接字将发送请求并等待响应。

第三步:连接端点
socket.connect("tcp://localhost:5555")

将套接字连接到本地主机上的 5555 端口。这是服务器监听的端口。

发送消息请求

发送消息不是固定的,可以用静态字符串发送,也可以输入信息发送,但用socket发送消息的函数是不变的。

socket.send()

用于发送消息

socket.send(buffer(data), send_flags::none);
函数参数
buffer(data)

这是一个 zmq::buffer 对象,它是一个辅助类,用于创建一个消息缓冲区。在这里,它接收一个 std::string 类型的参数 data,并将这个字符串的内容作为消息发送。buffer 类型的对象通常用于封装消息数据,以便与 ZeroMQ 的套接字接口一起使用。

send_flags

这是一个枚举值,用于指定发送消息时的选项。send_flags::none 表示没有特殊的发送标志,即消息将按照默认的方式发送。ZeroMQ 还提供了其他发送标志,例如:

send_flags::dontwait:非阻塞发送,如果无法立即发送消息,函数会立即返回,而不是等待。
send_flags::sndmore:表示消息分多部分发送,这个标志用于告诉 ZeroMQ 还有更多的消息部分即将发送。

函数返回值

在 ZeroMQ 的 C++ 绑定中,socket.send() 函数的返回值是一个整数,表示发送的字节数。这个返回值通常用于确认消息是否成功发送,以及发送了多少数据。
如果发送成功,函数返回发送的字节数。如果发送失败,函数返回 -1,并设置相应的错误代码,可以通过 errno 来获取。

接收应答端的回复

message_t

这个message_t也是ZMQ库中的类,reply也就是类的对象

message_t reply{};

创建一个 message_t 类型的变量 reply,用于接收服务器的响应。

socket.recv();
socket.recv(reply, recv_flags::none);

从服务器接收响应消息,并将消息内容存储在 reply 变量中。

函数参数
reply

这是一个 zmq::message_t 类型的对象,它用于存储从套接字接收到的消息。zmq::message_t 是 ZeroMQ 库中用于表示消息的类。当 recv 函数成功执行后,reply 对象将包含接收到的消息数据。

recv_flags::none:

这是一个枚举值,用于指定接收消息时的选项。recv_flags::none 表示没有特殊的接收标志,即消息将按照默认的方式接收。ZeroMQ 还提供了其他接收标志,例如:

recv_flags::dontwait:非阻塞接收,如果当前没有消息可接收,函数会立即返回,而不是等待。
recv_flags::recvmore:告诉 ZeroMQ 预期更多的消息部分将会到来。这通常用于多部分消息的接收。

函数返回值

在 ZeroMQ 的 C++ 绑定中,socket.recv() 函数的返回值是一个布尔值,表示是否成功接收到了消息。这个返回值用于判断接收操作是否成功完成。

如果返回 true,表示成功接收到了消息,并且 zmq::message_t 对象(如示例中的 reply)中包含了接收到的消息数据。
如果返回 false,表示接收操作失败。失败的原因可能是因为套接字被关闭、发生了错误,或者(如果使用了非阻塞标志)没有消息可接收。

应答端

建立与端点的连接

第一步:创建ZMQ上下文
context_t context{1};

创建一个 ZeroMQ 上下文(context),并初始化为只有一个 I/O 线程。context_t 是 ZeroMQ 库中用于管理套接字的类。

第二步:创建一个请求套接字
socket_t socket{context, socket_type::rep};

在上下文中创建一个套接字(socket),并指定其类型为 rep(应答者)。这意味着这个套接字将等待请求消息并响应回复。

第三步:连接端点
socket.bind("tcp://*:5555");

将套接字连接到本地主机上的 5555 端口。这是服务器的端口。

接收请求端的请求消息

message_t

这个message_t也是ZMQ库中的类,reply也就是类的对象

message_t request;

创建一个 message_t 类型的变量 request,用于接收请求端的消息。

socket.recv();
socket.recv(request, recv_flags::none);

从服务器接收响应消息,并将消息内容存储在 request变量中。

处理请求消息,应答请求

socket.send()

用于发送消息

socket.send(buffer(data), send_flags::none);

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

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

相关文章

知识竞赛答题设备及答题方式有哪些

根据我们多年的知识竞赛承办经验&#xff0c;我来谈谈在知识竞赛中常用的答题设备和答题方式。 一、常用答题设备 1.电脑 如果电脑资源充足&#xff0c;可以用笔记本电脑进行答题&#xff0c;笔记本电脑可以采取有线或无线方式进行连网&#xff0c;可以根据情况选择连网方案&…

PyTorch专栏介绍

专栏导读 深度学习作为人工智能领域的重要分支&#xff0c;其应用范围广泛&#xff0c;从图像识别到自然语言处理&#xff0c;再到强化学习等。PyTorch作为当前流行的深度学习框架之一&#xff0c;以其动态计算图和易用性受到了广大开发者的青睐。本专栏将带领读者从零开始&am…

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

结构开发笔记(五):solidworks软件(四):绘制36x36方块摄像头基座

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141422131 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【hot100篇-python刷题记录】【盛最多水的容器】

R6-双指针篇 印象题 双指针法&#xff0c;num1在0处&#xff0c;num2在n-1处&#xff0c;相对移动收缩。 核心&#xff1a; 每次单步移动短板&#xff0c;因为长板收缩面积肯定变小。 面积&#xff1a;短板决定 class Solution:def maxArea(self, height: List[int]) ->…

【嵌入式软件】stm32内部flash读写

1.简介 控制系统采用STM32F429IGT6,STM32F429IGT6 的 FALSH 容量为 1024K 字节。 STM32F429 的闪存模块组织如下表所示。 STM32F429xx 的闪存模块由:主存储器、系统存储器、OTP 区域和选项字节等 4 部分组 成。 1)主存储器,该部分用来存放代码和数据常数(如 con…

PHP开发过程中常见问题快速解决

1.PHP解决文件名不合法,无法创建 文件名称不能含有 /\:*?"<>|符号&#xff0c;直接替换关键词就OK了 $search array(*,$,\\,/,"",",*,?,:,<,>,|, ,[,],【,】,(,),&#xff08;,&#xff09;); $name"1:.php"; $new_namestr_repla…

Windows 11新版将至:Zen5、Zen4、Zen3游戏性能一起飞

锐龙9000系列发布之初&#xff0c;有些媒体和玩家发现&#xff0c;其游戏性能没有官方宣传的提升那么高&#xff0c;于是产生了一些质疑&#xff0c;AMD今天特意就此撰文&#xff0c;给出了详细的解释&#xff0c;并透露未来会随着Windows 11的升级而释放更多性能潜力。 事实上…

FreeRTOS学习:内存管理

FreeRTOS内存管理简介 在使用 FreeRTOS 创建任务、队列、信号量等对象的时候&#xff0c; FreeRTOS 一般都提供了两种方法&#xff0c; 动态方法创建&#xff1a;自动地从 FreeRTOS 管理的内存堆中申请所创建对象所需的内存&#xff0c;在对象被删除后&#xff0c;又可以将这…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

Scrum敏捷开发高效实践课程:面向企业团队的系统化训练,旨在提升研发效率,优化项目管理,推动企业敏捷化发展。

课程简介&#xff1a; Scrum 是一种广泛应用的敏捷开发方法&#xff0c;用于项目管理和产品研发。该课程为期两天&#xff0c;专为研发管理者、项目经理、产品经理和研发团队设计。通过案例讲解和沙盘演练&#xff0c;学员将深入理解Scrum的核心理念&#xff0c;如产品价值驱动…

基于x86 平台opencv的图像采集和seetaface6的人脸跟踪功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸跟踪功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸跟踪模块从而实现…

谢广坤:愿意说话你自己起个头行不?刘能:我起头不费劲吗!

谢广坤&#xff1a;愿意说话你自己起个头行不&#xff1f;刘能&#xff1a;我起头不费劲吗&#xff01; --小品《欢乐农家》&#xff08;赵家班、上&#xff09;的台词与解说 刘能&#xff1a;大脚 谢大脚&#xff1a;咋的了这是 大过年的 刘&#xff1a;脚崴了 大脚&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

饮水机开水前加入童锁判断

饮水机开水前加入童锁判断 引言 饮水机加入童锁, 是配合红外线, 进行防误触检测. 我们模仿红外线检测杯子, 加入童锁变量, 这个变量是人工控制的, 开水前,检测一下童锁,如果童锁锁住 , 则不能开水, 我们只需要修改一下底层即可. 本博客修改完的代码工程: https://wwyz.lanzou…

《计算机操作系统》(第4版)第6章 输入输出系统 复习笔记

第6章 输入输出系统 一、I/O 系统的功能、模型和接口 1.I/O 系统的基本功能 (1)隐藏物理设备的细节。 (2)与设备的无关性。 (3)提高处理机和I/O 设备的利用率。 ( 4 ) 对I/O 设备进行控制。 (5)确保对设备的正确共享。 (6)错误处理。 2.I/O 系统的层次结构和模型 (…

21.1 Netty介绍及服务搭建

21.1 基于Netty实现聊天 一. 章节概述二. `Netty`介绍三. 阻塞与非阻塞1. 阻塞与非阻塞简介2. BIO同步阻塞3. NIO同步非阻塞4. AIO异步非阻塞IO5. 异步阻塞IO(用的极少)6. 总结四. Netty三种线程模型1. 单线程模型2. 多线程模型3. 主从线程模型五. 构建Netty服务器************…

【传输层协议】UDP协议 {端口号的范围划分;UDP数据报格式;UDP协议的特点;UDP的缓冲区;基于UDP的应用层协议}

一、再谈端口号 1.1 端口号标识网络进程 如何通过端口号找到主机上的网络进程&#xff1f; 在socket编程中bind绑定是最为重要的一步&#xff1a;他将套接字与指定的本地 IP 地址和端口号关联起来&#xff0c;这意味着指定的套接字可以接收来自指定 IP 地址和端口号的数据包…

跟李沐学AI:转置卷积

定义 卷积不会增大输入的高宽&#xff0c;通常卷积层后高宽不变或减半。转置卷积则可以用来增大输入的宽高。 转置卷积是一种卷积&#xff0c;它将输入和核进行了重新排列&#xff0c;通常用作上采用。 如果卷积将输入从变为&#xff0c;同样超参数的情况下&#xff0c;转置…

坐标大连!提交EI、Scopus、知网检索!第五届经济管理与大数据应用国际学术会议(ICEMBDA 2024)

合作ACM出版-EI稳检索 高录用&#xff0c;快见刊&#xff01; 管理、经济、金融、计算机相关主题均可投稿 目前仍有口头汇报名额&#xff0c;如有需要请尽快报名 重要信息 会议官网&#xff1a;www.icembda.org 会议时间&#xff1a;2024年10月25日-27日 会议地点&#x…