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

嵌入式linux跨平台基于mongoose的TCP C++类的源码

嵌入式linux开发中,需要使用http服务器时,mongoose是个很好的选择,linux,win双平台都支持,代码全开放,简单明了,我非常喜欢这种尽在撑控中的感觉(关于mongoose实现一个小型的http服务,我之前的博客已有说明)。近日,有在linux,win下编写TCP的需求,mongoose当然也能很好的实现tcp。在此做个笔记。

我使用qt5的creator做为主开发界面,为了代码的通用性,我选择用qt creator新建一个non qt project项目,用C++类的方法对mongoose进行封装。因为mongoose本身是支持linux,win双平台的,其本不需做任何改动,即可在双平台下编译成功。但在linux平台下,需要qt项目指定链接pthread库,而在win平台下,需要指定链接Ws2_32网络库,在QT5项目的pro文件中加入以下内容

#CONFIG += linux
CONFIG += WIN32

CONFIG(WIN32){
LIBS += -lWs2_32
}
else{
LIBS += -lpthread
}

编译时,根据不同的平台,设定CONFIG的内容即可实现跨平台的编译

代码本身用到c++11才支持的lamda函数,因此需要编译器支持c++11特性。在win下可用qt5自带的mingw  编译通过,linux下可用gcc4.7(包括交叉编译用的gcc)以上即可编译通过。

在代码中,tcp_server,tcp_client是两个mongoose的tcp的封装类。在使用时,用lamda函数进行server或client的服务开启关闭,连接,断开事件的处理,数据的传送处理等。

tcp_client没啥好说的,基本就是mongoose的简单封装。
tcp_server主要的特点,是还实现了多个tcp连接的管理。mongoose本身也有简单的连接管理,但用c++的方法管理起来更方便。因此这个tcp_server可以支持多个连接的管理,在嵌入式linux中,多个连接的管理不常用,但有时还是需要的。

另外,mongoose是基于事件驱动的,在某个线程中通过mg_mgr_poll函数来实现事件驱动。为方便使用,我在这两个类中,分别使用了一个C++11的thread,并做了线程安全处理。TCP_Server是服务开启各关闭时,同时实现thread的新建和销毁,TCP_Client是在连接和断开时,实现thread的新建和销毁。这样,在使用这两个类时,不用关心线程问题,是要关心数据的接收和处理即可。

在这里我将完整的源码放出来供大家参考、使用。

https://download.csdn.net/download/hugerat/89936871?spm=1001.2014.3001.5503

http://www.lryc.cn/news/473171.html

相关文章:

  • 入驻商家必看:如何在TikTok实现多店铺高效上货及运营?
  • spring-boot-starter-data-redis
  • 科研绘图神器:机制图、模式图有哪些好用的工具推荐?
  • DIFFUSIONSAT: A GENERATIVE FOUNDATION MODEL FOR SATELLITE IMAGERY(2024-ICLR)
  • 文件中台与安全:集成方案的探索与实践
  • Redis 哨兵 总结
  • Systemd 和 Systemctl命令详解
  • 基于Multisim的音频放大电路设计与仿真
  • 这是一款专门为SQL新手小白量身定制的工具!
  • springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)
  • Android Input的流程和原理
  • InfiMM-WebMath-40B——利用由 24 亿数学文档组成的数据集提高 LLM 的数学性能
  • Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译
  • 第十八章 Vue组件样式范围配置之scoped
  • 【JavaScript】JavaScript 进阶-3-编程思想构造函数原型(更新中)
  • 头歌网络安全爬虫
  • 二、k8s快速入门之docker+Kubernetes平台搭建
  • k8s的发展历史
  • Pytorch lightning多机多卡训练通讯问题(NCCL error)排查
  • React如何实现Vue的keepAlive功能
  • 在 Ubuntu 22.04 LTS 上安装 NVM (Node Version Manager) 管理和切换不同版本的 Node.js npm
  • 如何搭建题库管理小序❓
  • Spring Boot框架下校园社团信息管理的创新实践
  • vscode clangd for cuda 插件配置
  • 软件测试学习笔记丨SeleniumPO模式
  • 研发效能DevOps: Vite 使用 Vue Router
  • 记第一次本地编译seatunnel源码
  • 《云主机配置全攻略》
  • RHCE nginx架构和安装
  • Jmeter自动化实战