Linux 下使用 C++ 实现的 Web 文件服务器

2023-11-19

项目地址:

Github:https://github.com/shangguanyongshi/WebFileServer

在学习完成《TCP/IP 网络编程》和《Linux高性能服务器编程》后,阅读了一些Web服务器的相关代码,自动动手使用 C++11 实现了这个 Linux 下简单 Web 文件服务器,通过浏览器发送 HTTP 请求管理服务器指定文件夹下的所有文件。主要功能包括:

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

HTML 的文件列表页面如下所示:

请添加图片描述

整体框架

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

请添加图片描述

功能展示

获取文件列表

请添加图片描述

上传文件

请添加图片描述

下载文件

请添加图片描述

删除文件

请添加图片描述

运行

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

拓展

由于时间匆忙,该项目仅仅完成了最基础的功能,但是该项目还有很多可以继续拓展的功能,这里简单列出,以后会继续完善:

  • 现有程序中,运行日志直接输入到控制台,另设进程池实现日志服务(实现远程日志服务器)

  • 增加用户注册登陆功能,根据登陆账户提供各自的文件服务

  • 添加定时器定时处理非活动的连接

参考资料

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

Linux 下使用 C++ 实现的 Web 文件服务器 的相关文章

  • Microsoft Graph API 授权错误:无效受众

    我知道这是一个很长的问题 但如果有人能与我分享他们的想法或经验 我真的很感激 因为我已经解决这个问题几天了 现在正在尝试很多事情 我有一个 ASP Net Core 3 1 Web API 应用程序和一个 ASP NET Core 3 1
  • 在运行时配置 ASP.NET 会话状态

    我们有一个使用 SQL Server 会话状态的 ASP NET 网站 状态配置在Web config like
  • 如何解决“HTTP 错误 404.3 - 未找到”错误?

    简单的问题 我启动 VS2008 并创建一个新的 WCF 服务应用程序 这将创建一个默认应用程序 并使用一些测试方法来显示它的工作原理 我按 CTRL F5 确实有效 伟大的 但是 它使用 Visual Studio 开发服务器 我不想支持
  • 在 html 中创建子页面 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我有一个网站http www example com http www example com 如何为此页面创建更多子页面 即 w
  • 从对象中获取类型正在返回运行时类型[重复]

    这个问题在这里已经有答案了 我有一个简单的功能 public string getType object obj Type type obj getType return type FullName 如果您在运行时创建的字符串对象上使用此函
  • 正确别名向量

    我无法在其他地方找到答案 所以我想我只需要问这个 我正在尝试获取向量 其中存储 int 指针 的别名 如下所示 void conversion Engine ENGINES The Engine class has a vector of
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • 在 LINUX 上测量 TLB 未命中的命令

    有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗 是否可以将轻微页面错误视为 TLB 未命中 您可以使用perf去做这个 前提是你的CPU支持 Use perf list了解可用的计数器 当我拿到这个列表并查找 TLB
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 使用 Entity Framework Core 在运行时迁移

    我正在将 PHP Illuminate 应用程序移植到 ASP NET Core EF Core 其中一部分由类似 Wordpress 的安装过程组成 该过程要求提供数据库凭据 然后创建应用程序运行所需的表 本质上 我想在运行时运行某种迁移
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • 使用本地系统帐户运行时,GetAccessControl 方法失败,出现意外错误代码 3

    我已经创建了 Windows 服务并使用本地系统帐户运行它 该服务正在读取用户文件并查找其所有者 在获取文件的访问权限以查找所有者时 它抛出以下异常 方法失败 出现意外错误代码 3 StackTrace 在 System Security
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • GridView,在代码中添加标题行第 2 部分

    这是这篇文章的延续 但添加了完整的代码 ASP NET GridView 在代码中添加标题行 https stackoverflow com questions 19119004 asp net gridview adding header
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

    我正在尝试使用 c 在 Windows 窗体中创建一个类似 swype 的键盘 我有两个问题 A 我无法重现手指滑动动作 b 我无法识别不同按键下的字母 对于第一个问题 我使用了 Graphics 类和 Pen 类 并像这样使用它 bool
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include

随机推荐

  • 如何解决项目管理中遇到的困难?

    其实是四个点 时间 成本 资源 范围 质量 1 这在四个点中 最重要的是质量 唯一不可变的也是质量 因此是一个以质量为中心的 三个点围绕的三角 2 基于第一点 在质量不变的情况下 考虑其它的三个点 时间 成本 范围 平衡也是在这三点之间平衡
  • 【毕业设计源码】基于Uniapp、Vue、Node的校园预约小程序系统(前后分离)

    功能描述 此系统包含小程序端和管理员后台端 小程序端是给用户预约操作的 具有以下模块 1 预约教室 2 取消预约 3 查看教室信息 4 收藏信息 包括新闻 教师 5 查看新闻 6 注册与登录PC管理后台是给后台管理员操作的 具有以下模块 1
  • Java数组笔记及算法练习

    Java数组笔记及算法练习 本文档创作于代码随想录算法训练营一期 参考文献链接 代码随想录 Java数组完全解析 java数组 超详细 文章目录 Java数组笔记及算法练习 1 数组基础 1 1一些基本说明 1 2数组的初始化 1 3数组的
  • 游戏修改器制作教程七:注入DLL的各种姿势

    教程面向有C C 基础的人 最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译 如果你还在用VC6请趁早丢掉它 写这个教程只是为了让玩家更好地体验所爱的单机游戏 顺便学到些逆向知识 我不会用网络游戏做示
  • 数据结构——哈希排序

    哈希排序 就是用空间换取时间的一种排序方式 空间利用率达O n 算法思想 如果一个元素序列a里没有重复的元素 而我们需要找最大值或者前几个最大值时 怎么办呢 1 将这个a序列排序 然后直接选出目标值 2 开辟一个b数组 a里的每一个元素对应
  • WDK李宏毅学习笔记第八周01_Point Network

    文章目录 摘要 一 Pointer Network 1 1 目的 1 2 原理 1 3 优点 二 Applications Summarization 2 1 原理 2 2 优点 三 Applications Translation and
  • TensorFlow实战练习

    TensorFlow实战1 TensorFlow实现手写数字识别 前言 MNIST数据集 学习心得 全代码如下 TensorFlow实现手写数字识别 前言 本人正在学习TensorFlow的使用 使用的书籍是 TensorFlow实战 黄文
  • U-net源码讲解(Keras)

    更新 这个项目是2018 8月份写的 时间过得真快 现在都快一年了 其实深度学习这方面各种软硬件更新很快 如果你是新手学Unet 那么用keras版的也是蛮好的 但是到最后有自己的一点需求后再在此基础上搭自己的模块后Keras就显得很麻烦了
  • 浅谈HTTP中Get、Post、Put与Delete请求方式的区别

    1 GET请求会向数据库发索取数据的请求 从而来获取信息 该请求就像数据库的select操作一样 只是用来查询一下数据 不会修改 增加数据 不会影响资源的内容 即该请求不会产生副作用 无论进行多少次操作 结果都是一样的 2 与GET不同的是
  • 房价预测回归模型--tensorflow2.0学习笔记--tf.keras使用实例

    import tensorflow as tf import matplotlib as mpl import matplotlib pyplot as plt matplotlib inline import numpy as np im
  • Netty框架之概述及基本组件介绍

    概述 Netty是由JBOSS提供的一个java开源框架 是一个高性能 高可扩展性的异步事件 驱动的 网络应用程序框架 它极大地简化了TCP和UDP客户端和服务器开发等网络编 程 NIO有下面的缺点 JDK 的 NIO 底层由 epoll
  • 计算机文件及文件夹管理软件,常用管家(电脑文件夹管理工具)V1.1 免费版

    常用管家 电脑文件夹管理工具 是一款很优秀好用的文件夹管理助手 如果你需要一款好用的文件夹管理工具 不妨试试小编带来的这款常用管家软件 功能强大全面 使用后可以帮助用户更轻松便捷的管理文件夹 软件能够快速收藏和打开常用的文件夹 网站 并且能
  • 决策树实战:california房价预测

    Python3 7 决策树实战 california房价预测 网上有好多2 版本的代码 但是本地安装的是python3 7版本 在学习中遇到很多问题 有很多地方和2 版本的不一样 所以记录下来方便参考 侵权必删 导入模块 import pa
  • CISCN2018-WP

    MISC 验证码 用token登录 输入好验证码就可以得到flag Picture 图片隐写 一下就想到binwalk或者winhex打开试试 binwalk打开无果 将这段数据ctrl shift c复制出来 用下面python脚本生成z
  • HTML标签及浮动

  • 7.块设备驱动的I/O请求处理(2)

    不适用请求队列 使用请求队列对于一个机械磁盘设备而言的确有助于提高系统的性能 但是对于RAMDISK ZRAM Compressed RAM Block Device 等完全可真正随机访问的设备而言 无法从高级的请求队列逻辑中获益 对于这些
  • 稳定性相关大纲

    稳定性建设的几个维度 个人渣记录仅为自己搜索用的博客 CSDN博客 道法术器 稳定性相关 代码 产品灰度能力 降级百分比能力 动态diamond doom测试 单元测试 稳定性改造 高资源占用优化 方法 架构上改造降流量 例如心跳 内部逻辑
  • 真正的阅读者,是不需要荐书的

    From http www luanxiang org blog archives 2136 html 早上一个朋友在朋友圈里跟我说 上次你推荐的 信息简史 和 知识的边界 两本书 我觉得很不错 这条消息让我比较差异 首先我并没有 推荐 过
  • 数据集分割

    步骤 1 确定训练集和测试集是否同分布 常用方法 1 留出法 实现 直接将数据集拆分为互斥的训练集 验证集和测试集 划分比例 训练集 验证集 测试集 7 1 5 1 5 注意事项 单次使用留出法会导致模型不稳定 保证三种数据集中样本比例的相
  • Linux 下使用 C++ 实现的 Web 文件服务器

    项目地址 Github https github com shangguanyongshi WebFileServer 在学习完成 TCP IP 网络编程 和 Linux高性能服务器编程 后 阅读了一些Web服务器的相关代码 自动动手使用