2022年4月3日记:Linux服务器开发,Mark,libevent/libev框架实战的那些坑
libevent/libev框架实战的那些坑
- 前言
- 总结
前言
服务器就像一个陀螺,驱动此陀螺得方式只有三种:网络IO事件、定时事件以及信号事件。
常识:如何看一个网络库?
两个线索
- 网络封装(io检测,io操作)
- 解决问题(连接的建立,连接的断开,数据发送及到达)
static int lmono(lia_state *L){lua_pushinteger(L.systime_mono());return 1;}static int lwall(lua_state *L){lua_pushinteger(L,systiime_wall());return 1;}
wall+mono2-mono1
有的人喜欢修改系统时间,用这种方式可以保证不会发生错误。
将数据按照优先级放到不同的队列中进行处理。
- event_add
- event_del
- event_assign
讲到这里时,Mark老师有些疑惑感叹到:添加删除红黑树节点该不会已经忘记了吧!?
但是现实正是不出Mark老师所料,这句感叹真是恰到好处。
bind() listen() accept()三个函数都用 evconnlistener进行封装,将accept的错误码处理完塞给回调函数以达到隐藏的目的。
用户态需要写缓冲区,buf有字节缓存才能写出去。
- fixbuf
- ringbuf
记录读写位置,逻辑的环形,实际还是一个数组。 - chainbuf
用不同的回调函数对事件进行解耦。
边沿模式第一次设置,epoll_wait()肯定会返回,还有缓冲区从满到不满的时候。
总结
目前应该具有封装异步事件的网络库,但是目前看来我肯定是还没有。 解决方案就是把代码拿来,手敲一下~