linux网络编程:epoll+reactor实现文件下载服务器

想来学习linux下的网络编程已经有一段时间了,于是写了这样一个文件下载服务器来复习总结一下。回想起来这段学习历程,从最开始的回声服务器,到后来的多路I/O复用,再到后来的多进程、多线程、线程池服务器,这一路走来感觉编程的世界真是其乐无穷。好了,废话到此为止。

××××××××××××××××××××××我是分割线×××××××××××××××××××××××××××××××××××××××

项目版本0.0地址: https://github.com/maybe4271/http_server

只实现了最基本的epoll模块、http_handle模块和储存客户端请求报文的链表模块,下一步计划是添加心跳模块,日志模块和配置文件。

程序的运行逻辑:
项目的工作逻辑是客户端(web服务器)发送请求报文->服务器端epoll监听到客户端读事件->将该该文件描述符从树上摘下->调用相应的回调函数,如果是第一次的话(判断是否在树上)则建立连接,并将新连接的客户端注册到epoll监听的红黑树上,否则处理读数据事件->处理事件(接收请求报文,解析报文并存储到链表尾)->注册写事件->等待写事件触发->写事件触发,将文件描述符从树上摘下->处理事件(发送数据)->注册读事件->循环。

大致是从libevent的epoll模块修改而来的,多线程版本就是开多个线程,每个线程里面有一个epoll,服务器端套接字在第一个epoll里面,服务器端监听到客户端套接字发起连接请求的时候,就将他加到其他的epoll里面,要注意线程间的同步。

你可能感兴趣的:(linux)