本项目是一个利用C语言编写的HTTP Web服务器Demo。支持静态资源处理,实现HTTP长连接。
- 配置服务器具体参数
port threadNum path pqSize
- 注册套接字文件描述符
socket() bind() listen()
- 初始化epoll,添加套接字文件描述符
- 初始化线程池和定时器
- 进入等待请求循环
- 请求连接
- 接受连接,返回连接描述符
- 在epoll中注册连接描述符
- 添加定时器节点
- 响应连接
- 在线程池中处理响应事务
- 初始化任务节点并加入任务队列 (taskHead)
- 激活一个等待线程 (pthread_cond_signal)
- 请求连接
采用Reactor模型,即事件同步循环 + 数据读写非阻塞(non-blocking I/O) + 线程池。
- 事件同步循环主要使用epoll模型监控每一个事件,各个事件拥有自己完整的处理流程,使用各自的线程独立执行。之所以同步是因为每个事件的线程直到完成才会返回推出。
- 非阻塞I/O指的是各个线程在执行read和write等系统调用时,在数据为准备好的情况下会返回并不断轮询。如果读取出错则推出。
- 请求事件到达服务器之后,创建任务并加入线程池,通过工作线程在执行相关操作(worker)。
- 系统:Ubuntu 18.04 server
- 编译器:gcc7.4
- 代码编辑器:Visual Studio Code
- 进入程序所在文件夹
- 执行make命令
make
- 开启服务器
./Server
- 客户端连接测试
- 确定服务器ip地址
serverip
和端口号port
- 在浏览器输入
serverip:port
- 确定服务器ip地址
- 目前还有不少bug,等待进一步验证和改进
- 进行压力测试
- 写个好看点的网页