学习webserver
文章目录
前言
用于学习和练习网络编程、linux编程、c++后台开发。
一、流程分析
该系统是实现浏览器(客户端)与服务端之间通过http报文的通信,
实现通信的方式是同步I/O模拟Reactor模式。
二、基础知识
1.IO多路复用
BIO模型:阻塞,多线程,消耗CPU资源
非阻塞忙轮询:多线程,占用更多的CPU资源
IO多路复用(NIO模型):用一个代理线程去等待,select/poll只会告诉你有多少个进程到达,不会告诉你哪些进程。epoll则会告诉你是哪些进程。
2.两种高效的事件处理方式
同步IO的Reactor模式:读写事件由线程(需要唤醒线程池)处理,进入请求队列(处理事件的队列)
异步IO的Proactor模式:读写事件由系统线程或主线程处理,通过信号来通知是否处理好了,不用进入请求队列。
3.Socket函数
三、代码解读
以程序的运行过程来解读
1.主函数
代码如下:
WebServer server(
1316, 3, /* 端口 ET模式 */
12, 6 /* 连接池数量 线程池数量 */
);
server._Start();
//构造函数初始化,参数分别为端口信息,选择了ET模式,连接池数量。start开启服务器
2.构造函数
代码如下:
//在实例初始化端口号、ET模式、文件路径、监听文件描述符、用户数量。
WebServer::WebServer(
int port, int trigMode,
int connPoolNum, int threadNum) :
port_(port), isClose_(false),
threadpool_(new ThreadPool(threadNum)), epoller_(new Epoller())
{
srcDir_ = getcwd(nullptr, 256); //获取当前的工作路径
assert(srcDir_);
strncat(srcDir_, "/resources/", 16);
HttpConn::userCount = 0;
HttpConn::srcDir = srcDir_;
InitEventMode_(trigMode);//设置ET模式
if(!InitSocket