Skip to content

woshiyigefeiwu/Mini_Webserver

Repository files navigation

记录 mini_webserver,以及一些改进(看不同分支的README.md)


webserver项目介绍和流程:

此项目是基于 Linux 开发的轻量级多线程 Web 服务器,在应用层实现了一个简单的 HTTP 服务器,

对客户端发送的GET请求进行处理;主要由两个单元组成:IO处理单元 和 逻辑单元;IO处理主要负责

对就绪事件的处理以及网络数据的读写;逻辑单元负责对http请求的解析以及生成响应报文。


具体的讲主要有 三/四 个部分组成:

主函数:

网络编程相关的(创建sock,bind,listen)

创建epoll,讲要监听的对象加入

创建http连接数组,保存所有连接信息(任务类)

创建线程池类

开始调用epoll_wait:

    监听sock就绪,则accept建立连接存到连接数组中,并且初始化(其中包括,通信的sock加入epoll,以及创建定时器加入定时器链表)

    管道就绪,标记一下,后面处理

    异常就绪,则断开连接,删除定时器

    读事件就绪,调用http连接数组中对应元素的read(其中包括 更新定时器,将sock读到自定义的读缓冲区中);接着将整个连接加入线程池类中的任务队列。

    写事件就绪,调用write(其中包括 更新定时器,将自定义的写缓冲区中的数据拷贝到sock中)

    最后,如果定时器响应了,则调用定时器链表的处理函数。

线程池类:

线程数量,线程池;

任务数量,任务队列(存整条连接)

互斥锁,条件变量,信号量

线程类是否结束

append函数(往任务队列加任务/连接)

work函数(线程的入口函数,static)

run函数(线程的,但是通过work中线程池类参数调用)(取出任务,执行任务的process)

http连接类(任务类):

全局的定时器链表(static)

全局的epoll fd(static,这也是为什么初始化连接和后面写时能将连接的fd加入epoll的原因)

自定义的读缓冲区

自定义的写缓冲区

init函数(初始化连接,main函数讲了)

read,write函数(main里面讲了)

process函数(任务执行函数,具体就是解析http(分为两部分,从读缓冲区读http数据,解析并写到写缓冲中,然后将连接的fd加入epoll)

定时器链表类:

节点是定时器(每个节点都挂载着一条连接)

没啥好说的就是一条链表

(每个类直接都是紧密相连的,特别主要main函数中的任务数组,以及任务连接什么时候加入epoll,已经线程池类)

About

记录 mini_webserver,以及一些改进

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published