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。
相关文章推荐
- 新人一枚,从此入驻CSDN博客
- 硬盘分区 5
- linux 命令每天必学之tar命令
- CentOS中设置.so链接文件路径
- linux共享内存
- CentOS 7安裝视频解码器
- centos安装ssh免密码登录
- CentOS设置打开终端快捷键
- CentOS 搭建hadhoop单机模式
- CentOS删除多余的启动项
- 修改SecureCRT终端的Home和End功能键
- 刚装完CentOS后连不上网
- CentOS安装mysql并授权远程登录
- CentOS 将网卡设置成eth0
- install google-chrome on CentOS 7
- centos 下 g++ 安装
- linux下的mv命令与系统rename关系
- 修复MBR的工具MBRFix下载
- "Couldn't resolve host 'mirrorlist.centos.org'"
- ubuntu解决arm-linux-gcc no such file的问题