您的位置:首页 > 运维架构 > Linux

C++(也许算是吧)+Linux 简易web服务器实现(with EPOLL&THREAD POLL)(1)

2015-11-01 00:06 337 查看

简述

大约一个多月前有选择性地看完了unix网络编程这本书,知道了基本的SOCKET操作和流程,知道了在SOCKET下进行I/O操作时的一些注意事项,然而,还是觉得应该把这本书学过的一些东西揉在一起做个小玩意儿出来才尽兴啊,要不然啥也记不住啊。

所以使用了epoll+线程池的模型实现了一个简易的web服务器,多简易?

只支持HTTP协议中的get方式获取网页。

我的服务器的实现基础是逻辑上单线程,I/O处理时使用多线程。

代码发布在了EZweb

逻辑模型

因为没有阅读过任何关于服务器的源码或者实现思路,所以基本上是自己摸黑写出来的,我的逻辑流程图可以用下面这幅图来表示:



首先就是每次都要做的初始化套接字,然后监听9898端口,我就是不想用HTTP协议的80.。

然后将监听套接字设置为非阻塞,这点很重要,后面我会说。并配置epoll管理监听套接字的event为边缘触发(也很重要,后面我也会说)。然后进入epoll_wait,epoll_wait会返回可处理的event的数量并处理作为值-参数传入的events数组。接下来对每一个event,都交由线程池来处理,并进行I/O处理以及读写之间的状态跳转。此时主进程会阻塞在等待条件变量的地方。当所有的线程处理完应该处理的任务后,给主线程发信号,主线程继续进入epoll_wait等待新的请求。

这就是我说的逻辑单线程,I/O多线程

待续

太晚了,明天我会继续介绍实现的细节以及一些名词的含义。

EZweb

这个项目如果fork下来的话,可以编译后使用,具体方法是:

在linux系统下,在项目文件目录使用
g++ -std=c++11 *.cpp -o EZweb -pthread
进行编译

运行编译出来的EZweb

在本机浏览器输入
127.0.0.1:9898
即可访问示例网页,目前我放在webSiteSrc文件夹中的示例网页是全部的C++标准内容。在局域网内的其他主机可以输入
本机ip:9898
访问示例网页

以后也许我会考虑提供一些命令行参数,可以配置主页面目录,线程数,等等。不过现在如果你希望跑自己的网页还是需要改代码,因为我写死在程序里了。

over。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: