挖掘网络库中冷门而有趣的小知识
在维护网络库时,总能遇到一些没太大用处,但是很有意思的小知识,细细碎碎又不成体系,记录一下
异步的epoll使用
2015.5.22整理:
epoll下LT和ET的处理都是大致相同的
LT模式
读buff有数据 / 写buff有空间,就触发
ET模式
读buff有数据,且数据减少或调用epoll_mod时 / 写 buff 空间增加或调用epoll_mod时,才触发
LT模式例子:
https://www.cnblogs.com/lojunren/p/3856290.html
https://github.com/hurley25/ANet
https://juejin.im/post/5ab3c5acf265da2380598efa
https://www.zhihu.com/question/22840801
https://blog.codingnow.com/2012/04/mread.html
在ET模式中,需要主动把数据读完或者写满:
读处理是一直read
返回-1,检查errno,如果是EAGAIN那么不再读(缓冲区读完),如果是其他那么说明连接出错,进行报错然后也不再读。
返回0,说明对端关闭
返回大于0,成功读到数据
写处理是一直write,直到数据写完
返回-1,检查errno,如果是EAGAIN那么不再写(缓冲区写完),如果是其他那么说明连接出错,进行报错然后也不再写。
返回大于0,成功写数据
在使用tcp时,内核的tcp上存在读写缓冲区,上层app通过这个缓冲区来和实际的网络进行通信
app <=> 内核tcp <=> network