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

简述

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

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

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

代码发布在了EZweb

逻辑模型

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

EZweb

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

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

待续

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

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

  1. 在linux系统下,在项目文件目录使用g++ -std=c++11 *.cpp -o EZweb -pthread进行编译
  2. 运行编译出来的EZweb
  3. 在本机浏览器输入127.0.0.1:9898即可访问示例网页,目前我放在webSiteSrc文件夹中的示例网页是全部的C++标准内容。在局域网内的其他主机可以输入本机ip:9898访问示例网页
  4. 以后也许我会考虑提供一些命令行参数,可以配置主页面目录,线程数,等等。不过现在如果你希望跑自己的网页还是需要改代码,因为我写死在程序里了。
  5. over。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值