slighttpd—Server项目实战
文章平均质量分 66
本项目基于lighttpd的架构思想,使用libevent实现纯异步事件驱动,采用master-worker多进程工作模式,引入状态机机制,并提供插件接口供开发者开发。
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
【slighttpd】基于lighttpd架构的Server项目实战(11)—C++的Name Mangling
上一节中,我们介绍了插件作为动态库的加载,其中我们注意到 函数:void* dlsym(void* handle,const char* symbol)返回的是【symbol对应的地址】。因此,在我们开发的插件中,SetupPlugin和RemovePlugin函数需要添加extern “C” :extern "C" Plugin* SetupPlugin(){ return new M原创 2016-02-12 14:03:53 · 2293 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(10)—插件&动态库
上一节我们介绍了状态机,本节我们将添加插件模块,之后就可以根据公共接口来开发插件,而我们的server则只需要通过状态机调用相应阶段的公共函数,无需关心插件的实现细节。我们的插件将以动态库so的形式来加载。插件我们的插件类将作为一个基类,成员函数作为虚函数,之后由插件开发者继承、实现。本项目的插件接口对应于状态机的阶段,每个阶段提供一个函数:/****************************原创 2016-02-12 13:45:52 · 2051 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(9)—状态机
上一节中,我们简单回顾了lighttpd的状态机机制,在本节中,我们将把状态机机制引入到我们的项目当中~我们的状态机大体上效仿lighttpd的状态机,不过有一些改动:typedef enum{ CON_STATE_CONNECT, CON_STATE_REQUEST_START, CON_STATE_READ, CON_STATE_REQUEST_END,原创 2016-02-09 21:46:46 · 1872 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(8)—状态机机制回顾
有限状态机FSM(Finite State Machine)关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。传统应用程序的控制流程基本是顺序的:原创 2016-02-06 15:10:05 · 3570 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser
对于http服务器,http request的解析是比较麻烦的,由于我们的重点并不在这上面,所以这一部分不打算自己编写,而是使用开源的http-parser库,下面我们将使用该库来构建项目中处理http的类。HTTP Parser简介http-parser是一个用C编写的HTTP消息解析器,可以解析HTTP请求或者回应消息。这个解析器常常在高性能的HTTP应用中使用。在解析的过程中,它不会调用任何系原创 2016-02-05 23:30:42 · 8164 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(6)—预备知识之Http
接下来,我们开始http部分的开发。在此之前,有必要先学习一下HTTP协议~http1.1 的rfc文档:http://www.ietf.org/rfc/rfc2616.txt简介超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求,服务器接到请求后,给予相应的响应信息。HT原创 2016-02-05 17:10:00 · 3086 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态
上一节我们已经开发了一个简单的echo服务器,在这里我们先不急着继续下去,先看看一些小细节!在listener的代码中,对于监听套接字,我设置了SO_REUSEADDR这个选项,那么,这个选项有什么用呢?int reuse = 1;setsockopt(listen_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));要明白这个问题,我原创 2016-02-05 12:37:24 · 1262 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简单的echo服务器。这一步我们需要添加两个类:Listener和Connection;Listener的职责:创建监听套接字;注册监听套接字事件;在监听事件的回调函数中进行accept并创建新连接;其头文件如下:/****************************************************原创 2016-02-04 23:23:45 · 1465 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(3)—Master&Worker模式
现在,我们开始一步步构建我们的项目了~Master-Worker模式本次一共涉及2个类:Master和Worker;以下是两者的头文件:/************************************************************************* > File Name: server.h > Author: Jiange > Mail:原创 2016-02-04 19:57:08 · 1534 阅读 · 2 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(2)—预备知识之libevent
简介由于本项目是纯异步的,而对于大量 socket 连接,使用 select 并不高效。(参见我的另一篇博文:epoll简介)事实上,大部分系统提供了处理大量 socket 连接的解决方案:Linux 下的 epoll()BSD 下的 kqueue()Solaris 下的 evportsWindows 下的 IOCP由于各个平台使用了不同的接口,所以想编写跨平台的高性能异步程序就需要做一层跨原创 2016-02-03 23:02:39 · 1701 阅读 · 1 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(1)—前言及设计思路
前言前一阵子读了一些书,譬如经典的《APUE》、《UNP》,初次接触Linux环境下编程、Linux网络编程,读完之后受益良多。然而“纸上得来终觉浅”,不结合实际项目,常常看完之后就忘了,于是开始阅读优秀的开源代码。一开始读tinyhttpd,一个500多行代码的轻量级http服务器,麻雀虽小五脏俱全,至少总体了解了一个http服务器的运作流程。接着读webbench,一个500多行代码的网站测压工原创 2016-02-03 21:05:55 · 1950 阅读 · 0 评论