Linux C++项目推荐:文件服务器+如何快速上手C++大项目

1 本次分享的意义

源码地址:https://github.com/shangguanyongshi/WebFileServer.git

视频讲解:Linux C++项目推荐:WebFileServer文件服务器+如何快速上手C++大项目

学完C++和Linux编程后, 可以以WebFileServer文件服务器作为练手项目,比WebServer项目多了文件上传的功能,更加有意义。

这次分享不单只是讲解这个WebFileServer项目如何运行,也能让大家掌握如何快速掌握自己不熟悉的C++项目。

2 项目功能

Web 文件服务器,通过浏览器发送 HTTP 请求管理服务器指定文件夹下的所有文件。主要功能包括:

  • 以 HTML 页面形式返回该文件夹下的所有文件
  • 可以选择本地文件上传到服务器
  • 可以对列表中的文件文件执行下载操作
  • 可以删除服务器中的指定文件

3 整体框架

  • 使用 Reactor 事件处理模型,通过统一事件源,主线程使用 epoll 监听所有的事件,工作线程负责执行事件的逻辑处理
  • 预先创建线程池,当有事件发生时,加入线程池的工作队列中,使用随机选择算法选择线程池中的一个线程处理工作队列的事件
  • 使用 HTTP GET 方法获取文件列表,发起下载文件、删除文件的请求。使用 POST 方法向服务器上传文件
  • 服务端使用有限状态机对请求消息进行解析,根据解析结果执行操作后,向客户端发送页面、发送文件或发送重定向报文
  • 服务端使用 sendfile 函数实现零拷贝数据发送

4 编译和运行

  1. build 项目
sh ./build.sh

默认的编译不支持调试,可以修改makefile增加-g编译选项。

然后再重新编译,以方便调试代码。

  1. 启动文件服务器
./main
  1. 在浏览器端输入 服务端ip:端口号(端口号默认是8888)
serverip:8888

5 如何快速分析代码

5.1 main函数入口

(gdb) b main
Breakpoint 1 at 0x5555555590ad: file main.cpp, line 3.

5.2 分析网络模型

通过info threads可以看到 共有五个线程,其中主线程是调用了epoll,再加上README的讲解可以推断出来这个项目是单个epoll +线程池的模式

* 1    Thread 0x7ffff79a9740 (LWP 339328) "main" 0x00007ffff7c1c68e in epoll_wait (epfd=4, events=0x7fffffffaf14, maxevents=1024, timeout=-1) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
  2    Thread 0x7ffff79a8700 (LWP 339343) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320
  3    Thread 0x7ffff71a7700 (LWP 339344) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320
  4    Thread 0x7ffff69a6700 (LWP 339345) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320
  5    Thread 0x7ffff61a5700 (LWP 339346) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320

5.3 网络数据收发

5.3.1 数据接收

断点 recv

Thread 4 "main" hit Breakpoint 4, __libc_recv (fd=5, buf=0x7ffff69a5600, len=2048, flags=0) at ../sysdeps/unix/sysv/linux/recv.c:24
24      ../sysdeps/unix/sysv/linux/recv.c: No such file or directory.
(gdb) bt
#0  __libc_recv (fd=5, buf=0x7ffff69a5600, len=2048, flags=0) at ../sysdeps/unix/sysv/linux/recv.c:24
#1  0x000055555555df4a in HandleRecv::process (this=0x55555558bb90) at event/myevent.cpp:38
#2  0x000055555555c114 in ThreadPool::run (this=0x55555558b2b0) at threadpool/threadpool.cpp:114
#3  0x000055555555bc5c in ThreadPool::worker (arg=0x55555558b2b0) at threadpool/threadpool.cpp:77
#4  0x00007ffff7f8a609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#5  0x00007ffff7c1c353 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

很明显,这个项目是在线程池的线程里读取socket 数据并解析解析处理。

5.3.2 数据发送

断点 send

说明数据的响应也是在线程池的线程进行的。

6 拓展建议

建议将本项目的功能一直到muduo库进一步测试,对比分析性能的差异。

也建议和nginx做更多测试对比。

这样可以不断优化项目的性能,面试的时候也能有更多可以讲解的内容。

#我的失利项目复盘##校招过来人的经验分享##校招##简历中的项目经历要怎么写##c++#
全部评论

相关推荐

自动驾驶C++后端技术栈适宜建议-&nbsp;对自动驾驶和机器人相关领域感兴趣,想从事该领域工作-&nbsp;本科或研究生基于ros框架,研究过算法方向,但是发布顶刊论文比较吃力,学历不占优势-&nbsp;目前只学过C++通用的技术栈,想钻营一个细分领域,提高自己校招的竞争优势-&nbsp;以上总结三种建议,后续学习需要花大量时间C++通用技术栈Linux学习Ubuntu系统(x86/ARM)熟悉Ubuntu操作系统的基本知识和常用命令。在x86和ARM不同体系结构上进行开发或运行,了解不同体系结构的特点和差异。Linux操作系统知识Linux的基本概念和原理,包括进程管理、内存管理、文件系统、设备驱动等。深入了解Linux的进程间通信机制,如管道、套接字和信号等。Linux系统函数知识熟悉Linux系统提供的常用函数,比如文件操作、进程管理、网络编程等。(大家常做的webserver项目)Linux相关性能分析和优化知识了解Linux性能分析工具和优化技术,识别和解决系统性能瓶颈工具如top、iotop、strace、perf等进行性能分析和排查问题C++C++基础语法包括变量、数据类型、运算符、条件语句、循环语句等C++特性面向对象编程(OOP)、类和对象、继承、多态性智能指针,线程库,C++常用特性模板编程了解模板的基本语法、函数模板、类模板、模板特化等常见标准库boost库,STL库计算机通识技术栈数据结构,设计模式,计算机网络,计算机操作系统自驾领域技术栈项目构建工具cmake、bazelhttps://github.com/Kitware/CMakehttps://github.com/search?q=bazel&amp;amp;amp;type=repositoriesros1ros教程:https://wiki.ros.org/ros基本原理-&nbsp;Nodes:ROS系统由多个节点组成,每个节点代表一个进程,可以是传感器、控制算法等。节点之间通过Messages进行通信。-&nbsp;Topics:主题是节点之间进行异步通信的方式,一个节点可以Publish消息到一个主题,其他节点可以通过Subscribe该主题来接收相关消息。-&nbsp;Services:服务是节点之间进行同步通信的方式,一个节点可以提供一个服务,其他节点可以请求该服务来获取特定的信息或执行特定的操作。-&nbsp;Parameter&nbsp;Server:参数服务器是一个分布式的键值存储系统,用于存储和共享配置参数和运行时参数。节点可以从参数服务器中读取和写入参数。-&nbsp;Messages:ROS使用基于消息的通信模型,消息是以特定格式定义的数据结构,用于在节点之间传递信息。消息可以是标准类型(如整数、字符串等),也可以是自定义的复杂数据类型。发布订阅模型,消息序列化协议(json,protobuf,xml)ros相关源码roscpp&nbsp;https://wiki.ros.org/roscpproscpp_serializationapollogithub:&nbsp;https://github.com/ApolloAuto/apollocyber:&nbsp;https://github.com/ApolloAuto/apollo/tree/master/cyber通信模块:intra,&nbsp;shm,fastddscyber&nbsp;doc:&nbsp;https://github.com/ApolloAuto/apollo/blob/master/docs/04_CyberRT/序列化协议:protobufDDSros2&nbsp;,apollo常见:fastdds&nbsp;:https://github.com/eProsima/Fast-DDS #自动驾驶#&nbsp;&nbsp;#机器人#&nbsp;&nbsp;#C++后端#&nbsp;&nbsp;#Linux#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务