利用protobuf和zmq实现网络通信

2023-05-16

  1. 经过不短时间的调试,终于搞定了protobuf和zmq两个第三方库的编译和使用,并且参考往事前辈的代码编写了两者之间的通信demo。

  2. protobuf的编译和使用,前面有篇博客已经讲了。

  3. zmq的编译我用的是zeromq-4.2.3这个可以在vs2015下面编译通过。

  4. 然后在zeromq-4.2.3_test\bin\Win32\Debug\v140\dynamic会生成lib和dll,dll每次用zmq的时候放到代码库,或者放到system32文件下面即可。

  5. 完成了protobuf和zmq 的编译就可进行网络通信的代码编写了。

  6. 我是参考别人的代码结构,但是我也踩了许多坑,调试成功的

  7. server端:

  8. #include
    #include"zmq.h"
    #include"zmq_utils.h"
    #include"helloworld.pb.h"
    const int bufflen = 128;
    using namespace std;
    int main()
    {
    void *context = zmq_ctx_new();
    void responder = zmq_socket(context, ZMQ_REP);
    zmq_bind(responder, "tcp://
    :5555");

    while (1)
    {
    zmq_msg_t request;
    zmq_msg_init(&request);
    int size = zmq_msg_recv(&request, responder, 0);
    char buff[bufflen];//这个声明位置的不对会导致程序崩溃,原因见下面的分析。这个是C语言的特性。因为zmq内部实现为C语言。
    memcpy(buff, zmq_msg_data(&request), size);

    helloworld rec;
    rec.ParseFromArray(buff, bufflen);
    cout << "id: " << rec.id() << "\t"
    	<< "str: " << rec.str() << "\n";
    zmq_msg_close(&request);
    Sleep(200);
    
    memset(buff, 0,bufflen * sizeof(char));
    helloworld msg;
    msg.set_id(303);
    msg.set_str("how");
    
    msg.SerializeToArray(buff, bufflen);
    int len = strlen(buff);
    zmq_msg_t reply;
    zmq_msg_init_size(&reply, len);
    	/*
    if (0 != zmq_msg_init_size(&reply, len));
    {
    	cout << "zmq_msg_init failed" << endl;
    	break;
    }
    */
    memcpy(zmq_msg_data(&reply), buff, len);
    zmq_msg_send(&reply, responder, 0);
    /*
    if (len = zmq_msg_send(&reply, responder, 0))
    {
    	zmq_msg_close(&reply);
    	cout << "send failed..." << endl;
    	break;
    }
    */
    cout << "id: " << msg.id() << "\t"
    	<< "str: " << msg.str() << "\n";
    zmq_msg_close(&reply);
    

    }
    zmq_close(&responder);
    zmq_ctx_destroy(context);
    system(“pause”);
    return 0;
    }
    由于zmq的实现是C语言的,所以在变量声明中要注意声明的顺序。
    最好用的时候再声明。解释是:编译器可能按声明变量顺序安排他们的位置,对字符串操作严重依赖在何处能找到字符串结束标志,如果没有,就用最近的’\0’,而它很可能是你上次赋值的其他变量的值的一部分。
    客户端代码:
    #include
    #include"zmq.h"
    #include"zmq_utils.h"
    #include"helloworld.pb.h"
    using namespace std;
    const int bufflen = 128;
    int main()
    {
    void *context = zmq_ctx_new();
    void *requester = zmq_socket(context, ZMQ_REQ);
    zmq_connect(requester, “tcp://127.0.0.1:5555”);
    cout << “Connect to server success…” << endl;

    while (1)
    {
    helloworld msg;
    msg.set_id(101);
    msg.set_str(“hello”);

    char buffer[bufflen];
    msg.SerializeToArray(buffer, bufflen);
    int len = strlen(buffer);
    zmq_msg_t req;
    if (0 != zmq_msg_init_size(&req, len))
    {
    	cout << "zmq_msg_init failed..." << endl;
    	break;
    }
    memcpy(zmq_msg_data(&req), buffer, len);
    if (len != zmq_msg_send(&req, requester, 0))
    {
    	zmq_msg_close(&req);
    	cout << "send failed.." << endl;
    	break;
    }
    cout << "id: " << msg.id() << "\t"
    	<< "str: " << msg.str() << "\n";
    zmq_msg_close(&req);
    Sleep(200);
    memset(buffer, 0, bufflen * sizeof(char));
    
    zmq_msg_t reply;
    zmq_msg_init(&reply);
    
    int size = zmq_msg_recv(&reply, requester, 0);
    memcpy(buffer, zmq_msg_data(&reply), size);
    
    helloworld rec;
    rec.ParseFromArray(buffer, bufflen);
    cout << "id: " << rec.id() << "\t"
    	<< "str: " << rec.str() << "\n";
    zmq_msg_close(&reply);
    

    }
    zmq_close(&requester);
    zmq_ctx_destroy(context);

    system(“pause”);
    return 0;
    }
    很好用啊。而且很强大。执行结果:
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用protobuf和zmq实现网络通信 的相关文章

  • 飞行控制器固件项目-对比介绍(Ardupilot、PX4、LibrePilot、OpenPilot)

    ArduPilot与Pixhawk什么关系 https zhuanlan zhihu com p 109639638 无人机开源项目 8个开源无人机项目 https blog csdn net cuml0912 article detail
  • 各种控制方法在抗干扰方面的区别

    一 由来 自适应控制 AdaptiveControl AC xff1a AC旨在处理由结构参数扰动引起的不良影响 AC的思想是首先在线识别受控系统的模型参数 xff0c 然后根据识别的模型参数调整控制参数以获得良好的性能 AC在处理模型参数
  • 【深入理解】export和module.export的区别

    内部原理 exports 61 module exports 61 exports 是module exports的引用 xff0c 怎么理解这句话呢 xff1f 大概就是 var a 61 var b 61 a a 和 b 之间的区别吧
  • 如何保证Service在后台不被杀死?

    一 前期基础知识储备 xff08 1 xff09 为什么要保证后台Service不被杀死 xff1f 提高应用存在感 对于大厂的应用来说 xff0c 其程序 活着 不是问题 xff0c 但是为了带来更好的用户体验 xff0c 提高用户粘性
  • mybatis generator时碰到的错误及解决办法

    这篇博客简单记录下自己使用mybatis generator时碰到的错误及解决办法 本人是在macOS下进行的下列操作 问题1 mybatis generator Cannot connect to database 解决办法 xff1a
  • C# 编写 WinForm 窗体应用程序(第一期)

    C 编写 WinForm 窗体应用程序 第一期 文章目录 C 编写 WinForm 窗体应用程序 第一期 WinForm窗体应用程序简述C 创建WinForm窗体应用程序C 窗体属性 1 创建一个名为 TestForm 的窗体 2 设置 T
  • npm删除项目所有依赖和清缓存

    清缓存的办法 xff0c 一个是 npm cache verify 还有一个方法npm cache clean force 删除项目所有依赖 npm uninstall 转载于 https www cnblogs com jimaww p
  • 【我的前端】CSS在Windows下实现Mac浏览器滚动条

    Windows实现Mac浏览器滚动条 文章目录 Windows实现Mac浏览器滚动条一 自定义滚动条外观二 滑块与滚动容器之间的间距三 将滚动条悬浮在内容之上四 滚动时才出现五 完整代码六 总结说明 x1f496 x1f496 x1f496
  • python经典案例:抓交通肇事者

    抓交通肇事者 x1f496 x1f496 x1f496 x1f495 x1f495 x1f495 欢迎来到本博客 x1f495 x1f495 x1f495 x1f496 x1f496 x1f496 x1f381 支持 xff1a 如果觉得博
  • 【Python初级人工智能精讲】用Paddlehub给一段没有标点符号的文字加上合适的标点符号

    Python初级人工智能精讲 文章目录 Python初级人工智能精讲一 写在前面二 七步精讲三 模型介绍四 进入实战1 源代码2 运行效果 1 cmd方面 2 txt文件运行前后对比 五 休吃霸王餐六 每日一句 一 写在前面 今天给分享的程
  • 深度解读互联网新时代:Web3.0

    文章目录 深度解读互联网新时代 Web3 0一 Web3 中心化网络的新兴名词二 Web3 全家福 三 Web3 是互联网的货币层四 Web3 是互联网的身份层五 Web3 通过售卖数据来牟利的反击六 Web3 还拥有平台本身的一种方式七
  • 《疫情下的编程岁月》第二章:选择学习语言

    文章目录 第二章 选择学习语言 2 1 常见的编程语言介绍 C语言 C Java Python JavaScript 2 2 选择适合自己的语言 考虑自己的兴趣和目标 了解各种语言的特点 尝试不同的语言 2 3 学习路线的规划 找到适合自己
  • 每日一练c++题目日刊 | 第十期

    文章目录 第一题 xff1a 二维矩阵中的最短路径题目描述输入格式输出格式数据范围输入样例输出样例解题思路 amp C 43 43 题解算法状态转移方程 第二题 xff1a 01 串的满足条件的个数题目描述输入格式输出格式数据范围输入样例输
  • 每日一练c++题目日刊 | 第八期

    文章目录 第一题 xff1a 夏洛克侦案题目描述输入格式输出格式输入样例输出样例解题思路 amp C 43 43 题解 第一题 xff1a 夏洛克侦案 题目描述 福尔摩斯接到了一个任务 xff0c 需要帮助一位富有的英国贵族解决一件谋杀案
  • 00后少年的心力之作(已开源) | heartt(心力算法)

    00后少年的心力之作 已开源 综合性极强的文本摘要算法 heartt 大家好 xff0c 我是 heartt 算法的作者 xff0c 一名热爱编程的学习者 今天 xff0c 我要向大家介绍我的新算法 xff1a heartt 文章目录 一
  • 初读《编程之美》就想秀一下,结果还翻车了

    文章目录 一 前言 二 我的思路 三 Code 四 翻车现场 五 后续问题 一 前言 如何写一个短小的程序 xff0c 让 Windows 的任务管理器显示CPU的占用率为50 这道有趣的面试题我是这两天从 编程之美 电子版中看到的 xff
  • 每日一练c++题目日刊 | 第十二期

    文章目录 第一题题目背景故事题目描述输入描述输出描述输入样例输出样例解题思路C 43 43 参考程序 第二题题目背景故事题目描述输入描述输出描述输入样例输出样例解题思路C 43 43 参考程序 第三题题目背景故事输入描述输出描述输入样例输出
  • 在TypeScript中如何在window上定义对象

    比如我们要在window上定义 Jim 最简单的方法就是将window强制类型转换成any xff0c 但是不推荐 xff01 window as any Jim 61 233 推荐方法 xff1a 在项目中找到 d ts 文件 加上以下代
  • CSDN第25期编程竞赛部分题解报告

    第一题 xff1a 分层遍历二叉树 时间限制 1000ms 内存限制 256M 题目描述 给定一棵二叉树 节点定义如下 structNode span class token punctuation span Node 34 pLeft s
  • PX4飞控导出GPS数据拟合飞行轨迹

    前言 xff1a 想要拟合飞行轨迹 xff0c 百度了一下 xff0c 高人介绍的都是什么百度地图API xff0c 无忧地图 xff0c PYTHON 不是不好 xff0c 是尝试了一下 xff0c 注册非常麻烦 xff0c 结果没拟合出

随机推荐

  • ROS,GAZEBO,PX4视觉仿真

    https gitee com bingobinlw some tree master Overview Simulation Px4 command Slam map image process planning P200 AmovCar
  • PX4无人机飞控开发——第3篇:室内定点之光流一

    PX4无人机飞控开发 第3篇 xff1a 室内定点之光流一 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第4篇:室内定点之光流二

    PX4无人机飞控开发 第4篇 xff1a 室内定点之光流二 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第1篇:仿真工具介绍

    PX4无人机飞控开发 第1篇 xff1a 仿真工具介绍 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞控开
  • 5G网络实现自动驾驶车联网——第一篇:5G模块介绍实现上网功能

    5G网络实现自动驾驶车联网 第一篇 xff1a 5G模块介绍实现上网功能 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正
  • 5G网络实现自动驾驶车联网——第二篇:5G网络内网穿透

    5G网络实现自动驾驶车联网 第二篇 xff1a 5G网络内网穿透 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 xff0
  • MIT Mini Cheetah仿真 错误处理

    一 编译步骤 git clone https github com mit biomimetics Cheetah Software git cd Cheetah Software mkdir build cd build cmake sc
  • 使用PIXIWell_RF 射频模块 虚拟GPS

    使用PIXIWell RF 射频模块 虚拟GPS 文章目录 使用PIXIWell RF 射频模块 虚拟GPS 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2 Ubuntu系统使用 三 查看连接情况
  • 如何去除button选中时的阴影效果

    使用box shadow可以去除button选中时四周的阴影 CSS代码如下 xff08 amp 是sass语法 xff0c 即当前button元素 xff09 xff1a button box shadow none webkit box
  • Failed to set attribute: Invalid input data or parameter 解决

    arm64 swconfig 配置vlan 失败问题 Failed to set attribute Invalid input data or parameter 解决 内核版本 xff1a linux 5 20 26 现象 xff1a
  • 使用PIXIWell_RF 射频模块 虚拟GPS windows系统

    使用PIXIWell RF 射频模块 虚拟GPS windows系统 文章目录 使用PIXIWell RF 射频模块 虚拟GPS windows系统 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2
  • DJI Mavic 2 & AUTEL Evo无人机无线链路_射频_RF测试

    背景 xff1a 出于对DJI大疆无人机的好奇 xff0c 航时上的持久 xff0c 尺寸上的拔尖 xff0c 距离上的长远 xff1b 让我们来看看它的它的无线链路 射频 RF波形长什么样子的 AUTEL Evo无人机可能很多人不太了解
  • 我如何使用iPad作为学习工具

    引言 如果不懂得使用app xff0c 其实iPad就是一块屏幕而已 如果你已经有iPad xff0c 那么 xff0c 恭喜你 xff0c 这篇文章正是为了让它发挥出更大价值 如果你还没有 xff0c 那么你就又多了一个剁手的理由 上我的
  • 利用STM32实现自平衡机器人功能与方法

    将机器人整体开源 xff0c 同时总结一下机器人搭建过程中遇到的坑和未来的改进方向 在分享的文件里包含了结构设计 程序控制 电路设计以及其他模块相关资料供大家参考 第一 xff1a 机器人原理分析 首先来看成品图 xff1a 如图所示 xf
  • Ubuntu 终端(terminal) 配置文件修改后保存方法

    1 ESC退出INSERT模式进入命令模式 2 输入 w 保存 输入 wq 保存退出 输入 wq 保存并强制退出
  • Linux复习: semaphore.h信号量和生产者消费者

    点击查看demo代码 demo运行结果如图 借用网上的一段话 在线程世界里 xff0c 生产者就是生产数据的线程 xff0c 消费者就是消费数据的线程 在多线程开发当中 xff0c 如果生产者处理速度很快 xff0c 而消费者处理速度很慢
  • ubuntu使用经验

    1 查看文件夹大小 xff1a du h max depth 61 1 max depth 61 1表示查看当前目录下所有文件夹各自的大小 2 查看ubuntu版本信息 xff1a cat proc version Linux versio
  • 如何得到github上传的以前的版本

    有时候我们可能想得到github上老版本的代码 这个时候先 git clone xxxx 现在最新版本的代码 然后cd xx 到文件夹里面 然后 git log commit b56065418b63a971fcf4f8f35d058513
  • STM32---串口实现在应用程序的固件更新(IAP)

    背景 xff1a 在产品发布后 xff0c 可能需要对固件进行更新或者升级 xff0c 那么在影响产品正常运行的情况下 xff0c 如果升级固件呢 xff1f 理论 xff1a 下面的所有理论部分内容参考 STM32开发指南 什么是IAP
  • 利用protobuf和zmq实现网络通信

    经过不短时间的调试 xff0c 终于搞定了protobuf和zmq两个第三方库的编译和使用 xff0c 并且参考往事前辈的代码编写了两者之间的通信demo protobuf的编译和使用 xff0c 前面有篇博客已经讲了 zmq的编译我用的是