上位机图像处理和嵌入式模块部署(树莓派4b和类muduo网络编程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

  

        既然是linux编程,那么自然少不了网络编程。在linux平台上面,有很多的网络编程库可以选择,大的有boost、qt,小的有libevent,总觉得用的不是很顺手。其实在linux上面,还有一个国人写的网络库muduo,是比较小巧的,使用上面也很方便,大家可以多多使用。本身它是面向linux服务器多线程编程的,用它来写一个类ros的通信框架,再合适不过了。

        本次实验用的是一个同学改写的类muduo,正版的muduo代码地址,大家可以参考这个链接。原版的muduo相对干净一点,基本上mkdir build && cd build && cmake .. && make就可以了。此外,正版本muduo所有的可执行文件都安装在build的bin目录下。

https://github.com/chenshuo/muduo/tree/master

1、下载代码

        代码可以直接从github上面下载。

https://github.com/shenmingik/muduo

2、解压代码

        解压的话就比较容易了,直接输入unzip muduo-main.zip即可。

3、开始编译

        解压的目录下面有一个build目录,里面的文件全部删除。cd到build目录里面,直接输入cmake ..即可。

4、编译过程中的两个问题

        cmake生成makefile之后,就可以开始编译了。编译过程中有两个问题,一个是提示我们找不到string定义,还有一个提示我们找不到snprintf的定义。解决方法也不复杂,首先需要Thread.hpp里面添加一个#include <string>的声明。另外snprintf的问题,则在Thread.cpp当中添加一个#include <pthread.h>的声明,这样就没什么问题了。

        至此,如果一切正常,就可以在lib目录下看到生成的动态库libmymuduo.so了。

5、准备编译example中的测试文件

        example里面有一个testserver.cc文件,可以用来测试和编译,

#include <TcpServer.hpp>
#include <string>
#include <functional>using namespace std;
using namespace placeholders;class EchoServer
{
public:EchoServer(EventLoop *loop, InetAddress &addr, string name): server_(loop, addr, name), loop_(loop){//注册回调函数server_.set_connection_callback(bind(&EchoServer::on_connection, this, _1));server_.set_message_callback(bind(&EchoServer::on_message, this, _1, _2, _3));//设置线程数量server_.set_thread_num(3);}void start(){server_.start();}private://连接建立或者断开的回调void on_connection(const TcpConnectionPtr &conn){if (conn->connected()){LOG_INFO("conn up: %s", conn->get_peeraddr().get_ip_port().c_str());}else{LOG_INFO("conn down: %s", conn->get_peeraddr().get_ip_port().c_str());}}//可读事件回调void on_message(const TcpConnectionPtr &conn, Buffer *buffer, TimeStamp time){string msg = buffer->retrieve_all_asString();conn->send(msg);conn->shutdown();}private:EventLoop *loop_;TcpServer server_;
};int main()
{EventLoop loop;InetAddress addr(8000);EchoServer server(&loop, addr, "echo 01");server.start();loop.loop(); //启动main loop的底层pollerreturn 0;
}

        输入g++ testserver.cc -I../include -g -o testserver ../lib/libmymuduo.so之后,提示我们头文件不对,这个时候把头文件当中的mymuduo/删去就可以编译通过了。

6、执行tesetserver程序

        编译没有问题之后,就可以开始执行了。首先需要把so文件从lib目录拷贝过来,接着就是./testserver开始执行,这个时候提示我们找不到动态库文件,其实配置一下LD_LIBRARY_PATH就可以了。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

        执行后的打印应该是这样的,

feixiaoxing@raspberrypi:~/Desktop/mudoo/muduo-main/MyMuduo/example $ ./testserver
[INFO]2024-04-21 13:18:35 : func = update_channel fd = 4 events = 3 index = -1[INFO]2024-04-21 13:18:35 : func = update_channel fd = 7 events = 3 index = -1[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8a17e5d0 start looping[INFO]2024-04-21 13:18:35 : func = update_channel fd = 9 events = 3 index = -1[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8996e5d0 start looping[INFO]2024-04-21 13:18:35 : func = update_channel fd = 11 events = 3 index = -1[INFO]2024-04-21 13:18:35 : EventLoop 0x7f8915e5d0 start looping[INFO]2024-04-21 13:18:35 : func = update_channel fd = 5 events = 3 index = -1[INFO]2024-04-21 13:18:35 : EventLoop 0x7fcaf25c10 start looping

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

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

相关文章

第二部分 Python提高—GUI图形用户界面编程(五)

事件处理 文章目录 鼠标和键盘事件多种事件绑定方式汇总组件对象的绑定组件类的绑定 一个GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生&#xff0c;并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑定给各个控件的各种…

飞书API(4):筛选数据的三种思路

截止到上一篇&#xff0c;终于通过飞书 API 完整获取到飞书多维表的数据。但是&#xff0c;有些场景&#xff0c;比如数据源会出现脏数据&#xff0c;毕竟如果是运营过程多人协作维护的数据&#xff0c;要想保持数据完美简直是天方夜谭&#xff01;再比如我们不需要完整的数据&…

ChatGPT研究论文提示词集合3-【数据收集】、【数据分析】和【解释与讨论】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.数据收集 2.数据分析 3.讨论与解释 4.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步…

都2024 年了,可以卸载的VS Code 插件

在 VS Code 中&#xff0c;庞大的插件市场提供了丰富多样的扩展功能&#xff0c;以增强编码体验和效率。然而&#xff0c;如果你安装了很多插件&#xff0c;就可能会导致&#xff1a; 性能下降&#xff1a;过多的插件可能导致 VS Code 的启动速度变慢&#xff0c;特别是在启动或…

详解QDialogButtonBox的使用

示例图片 QDialogButtonBox 是 Qt 提供的一个方便的组件&#xff0c;用于在对话框中集中管理一组标准按钮&#xff0c;如“确定”、“取消”、“保存”、“关闭”等。它简化了按钮的布局、信号连接以及按钮行为的统一处理&#xff0c;使得对话框的开发更为简洁和规范。以下将…

【GlobalMapper精品教程】075:将影像的颜色赋予点云实现点云真彩色

文章目录 一、加载点云与影像数据二、将影像色彩赋予点云三、保存色彩点云四、注意事项一、加载点云与影像数据 加载本实验数据(data075.rar)中的影像、点云数据,并用Globalmapper提供的卷帘工具(快速浏览图像)查看: 启动卷帘工具,左右拖动实现卷帘效果: 影像VS点云:…

Coggle数据科学 | Coggle 4月竞赛学习:多模态图文问答

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Coggle 4月竞赛学习&#xff1a;多模态图文问答 Part1 内容介绍 在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如GPT…

4月18号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次&#xff0c;每一层负责特定的功能&#xff0c;从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI&#xff08;开放系统互联&#xff09;模型和TCP/IP模型。 特点和作用&#xff1a; 分…

UI5 快速入门教程

环境准备 node >16.8 ,VSCode&#xff0c;官方网址 开始 创建一个根文件夹&#xff0c;根文件中创建一个package.json文件 {"name": "quickstart-tutorial","private": true,"version": "1.0.0","author":…

[python数据处理系列]详解独热编码与标签编码的区别及在Pandas中的实现

目录 一、独热编码与标签编码的区别 二、创建数据集 三、独热编码实现 (一) 自动将所有分类变量进行独热编码 (二) 对指定列进行独热编码 (三) 对进行独热编码的列采用布尔型表示 四、查看数据类型 五、对数据进行独热编码后&#xff0c;数据变成了什么类型 一、独热编码…

Python 数据结构和算法实用指南(三)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;哈希和符号表 我们之前已经看过数组和列表&#xff0c;其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效…

如何利用pg_dump和pg_restore迁移从一个PostgreSQL服务器到另一个服务器,同时保持一致性与高效性?

文章目录 解决方案1. 使用pg_dump导出数据2. 将导出的数据复制到目标服务器3. 使用pg_restore导入数据保持一致性与高效性的策略一致性高效性 示例代码导出数据复制数据到目标服务器在目标服务器上解压并导入数据 PostgreSQL数据库的迁移是一个常见的任务&#xff0c;特别是在升…