Reactor与http服务器实现

714fa96c3a8a479295f096b82fbd4e30.png

da0dea60a5bc46259e6c377b56a749eb.png

 

a3334359f1084411b8cb5e6387c47414.png

f5bd89cee00449b1b51299c4885a1f3f.png

多个io管理----reactor(反应堆)

0dce664c41934e09a475c18041e8c359.png

reactor的封装

流程:初始化服务器获得监听fd,初始化反应堆,反应堆中创建epoll树和io事件集合,把listen的fd添加到监听回调函数,有事件就调用accept回调函数,在accept回调函数中先accept,再设置事件即把对应io变成一个事件(读或者写)并对其设置回调函数为读事件(先调用recv是因为客户端先发给服务器的),再添加进epoll树,如果调用了recv回调函数,再在recv回调函数中调用recv函数,再删除节点,并更新set为send回调函数,并添加进epoll树上,启动反应堆函数,函数中取出epoll树等待的事件,遍历,如果返回的是可读,调用对应节点事件ev的回调函数callback,因为之前set过了对应的回调函数是什么,所以直接调用即可

前提

6179c3bfa2564916b1c302f20948ee7d.png

每一个io对应的事件存了什么

65f4456e87ff4da68020729a72a08ddc.png

reactor的内部

a32ca732c0544b54ac64b8676f401a11.png

fd转化为事件

fd可能是读也可能是写,这里把读和写分离操作,设置不同回调函数

2c7b376572b44c8da76a155c96f63c99.png

epoll节点的添加和删除

6f856caeeee444dcb184d220c5f5e908.png

读回调函数

267b0cbe2bc74f2290d092408e0ffd00.png

写回调函数

735e93a67e834d979855b06971cae4a6.png

接受连接回调函数

6dfac56596364e9186169fa25b63cf42.png

初始化服务器

11b541301d514051b34c5445c419fdb9.png

初始化reactor和销毁

900c896a733940c1941c4466a91deb14.png

设置listen函数

a5f04246c1ae422eb8b93cbb10039200.png

reactor运行函数

811c8da68d774290bb0da043d3414248.png

main函数

be82694ae549472e91203bb98c21cf07.png

单台服务器百万并发

同一个进程监听多个端口

60de14eb860f451ab020178c36fe087c.png

beead897aa15441e8083db5d91817ff1.png

9b9da46133574367b7f6eb0b3b360170.png

fdbefcef84344acf85c0656d169483cb.png

5f9436bd6193477396ac5bef2f9a1c5d.png

77f998cb10b64189a60626bcef0eb7e9.png

 

 

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值