WebServer项目——webserver详解
WebServer项目——webserver详解webserver介绍这个webserver类是对整个web服务器的抽象,基于HTTPconnection类、timer类、epoller类、threadpool类实现一个完整的高性能web服务器的所有功能。 需要满足的功能有: 初始化服务器,为HTTP的连接做好准备; 处理每一个HTTP连接; 用定时器给每一个HTTP连接定时,并且处理掉过期的连接; 运用IO多路复用技术提升IO性能; 运用线程池技术提升服务器性能; webserver的逻辑首先是进行服务器的初始化,进行各种参数设置。其中包括了事件模式的初始化、socket连接的建立过程,主要用到了以下两个函数: 12bool initSocket_(); void initEventMode_(int...
WebServer项目——HTTPresponse详解
WebServer项目——HTTPresponse详解HTTPresponse简介这个类和HTTPrequest相反,是给相应的连接生成相应报文的。HTTPrequest是解析请求行,请求头和数据体,那么HTTPresponse就是生成请求行,请求头和数据体。 HTTPresponse的组成所需变量和自定义的数据结构首先,我们需要一个变量code_来代表HTTP的状态。 在HTTPrequest中解析到的路径信息是相对路径,我们还需要补全,所以需要一个变量path_代表解析得到的路径,一个变量srcDir_表示根目录,除此之外,我们还需要一个哈希表提供4XX状态码到响应文件路径的映射。 我们在实现所需函数的过程中,需要知道HTTP连接是否处于KeepAlive状态,所以用一个变量isKeepAlive_表示。 由于使用了共享内存,所以也需要变量和数据结构指示相关信息: 12char* mmFile_;struct stat mmFileStat_; 所以,总结如下: 123456789101112int code_;bool isKeepAlive_;std::string...
WebServer项目——HTTPrequest详解
WebServer项目——HTTPrequest详解HTTPrequest简介这个类主要的功能是解析HTTP的请求信息。 HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。 抓包的request结构如下: 1234567GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1Host: www.baidu.com Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate,...
WebServer项目——HTTPconnection详解
WebServer项目——HTTPconnection详解HTTPconnection简介这个类就是对一个HTTP连接的抽象,负责对一个HTTP请求的解析和回复,以及提供读写的接口。 这个读写接口的底层就是靠buffer缓冲区来实现的,这个缓冲区提供了读写的接口。但是,写借口照样用了分散写的方法实现。然后就是对从socket连接中读取的数据进行解析,以及对请求做出响应。这部分的实现主要依赖于HTTPrequest和HTTPresponse来完成。 HTTPconnection组成其中的构造函数和析构函数略去不谈,缺省就可以。 所需变量和自定义的数据结构对于一个HTTP连接而言,我们需要用变量fd_唯一地标记它,用isClose_表示它是否需要关闭这个连接,已备后续关闭连接的函数的判断。一个HTTP连接还需要读写数据,所以给每一个HTTP连接定义一个读缓冲区和一个写缓冲区。在解析请求和响应请求的时候,我们借助HTTPrequest和HTTPresponse完成,所以也需要各种定义一个这两种变量。 总结一下,如下所示: 12345678int fd_; ...
WebServer项目——epoller详解
WebServer项目——epoller详解epoller的简介web服务器需要与客户端之间发生大量的IO操作,这也是性能的瓶颈之一。在这个项目中,我们用IO多路复用技术中的epoll来尽可能地提高一下性能。 epoll区别于select和poll,不需要每次轮询整个描述符集合来查找哪个描述符对应的IO已经做好准备了,epoll采用事件驱动的方式,当有事件准备就绪后就会一次返回已经做好准备的所有描述符集合。 epoll提供的程序接口有: 1int epoll_create(int size); 在内核中创建epoll实例并返回一个epoll文件描述符。 在最初的实现中,调用者通过 size 参数告知内核需要监听的文件描述符数量。如果监听的文件描述符数量超过 size, 则内核会自动扩容。而现在 size 已经没有这种语义了,但是调用者调用时 size 依然必须大于 0,以保证后向兼容性。 1int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 向 epfd 对应的内核epoll...
WebServer项目
用C++实现的高性能WEB服务器,经过webbenchh压力测试可以实现上万的QPS 项目地址:https://github.com/Aged-cat/WebServer 功能 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型; 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求; 利用标准库容器封装char,实现自动增长的缓冲区; 基于堆结构实现的定时器,关闭超时的非活动连接; 改进了线程池的实现,QPS提升了45%+; 项目详解WebServer项目——buffer详解 WebServer项目——epoller详解 WebServer项目——timer详解 WebServer项目——threadpool详解 WebServer项目——HTTPconnection详解 WebServer项目——HTTPrequest详解 WebServer项目——HTTPresponse详解 WebServer项目——webserver详解 环境要求 Linux C++11 项目启动123mkdir...
【小白搭博客】Hexo博客配置 | Butterfly主题
绑定域名xxx.github.io 这种统一标识的域名冗长难记,可以绑定自己的个性化域名。 购买域名,并且将域名的 @、www 子域名以 CNAME 的方式解析到 agedcat.github.io; 在 Github 仓库中,选择 Settings – Pages,在 Custom domain 这里, 输入个性化域名,保存并勾选 enforce https 选项; 在本地博客文件夹中,./source 目录下,创建一个记事本文件,输入你购买的域名,文件命名为 CNAME,保存类型为所有文件(*.*); 输入下述命令,将改动的配置同步到 Github: 123hexo clean hexo ghexo d 完成后在浏览器中输入个性化域名,验证效果。 自定义主题默认的 Hexo 博客主题为 landscape,功能简陋,可以根据自己的爱好更换其他主题。 我选择的主题为 Butterfly, 具体过程参见 安装和配置文档。 大部分设置可以参见官方文档,部分配置需要自行修改。 永久链接设置 安装插件 1npm install hexo-abbrlink...