epoll发数据学习
1、概述
发数据流程如下,下面问题你会怎么回答?
1、第一次为什么不是先注册可写事件,等可写事件触发后再发数据,而是直接发送数据?
2、如何表明当前数据一次性没有发完?
3、剩下的数据应该缓存到哪里?
4、如果当前已经有部分数据发不出去,业务层又来新的数据了,这些新数据应该缓存在哪里?
5、如果可写事件一直不触发,怎么办?有这种情况么?
2、分析
1、为什么不是先注册可写事件,等可写事件触发后再发数据,而是直接发送数据?
通常fd都是可写的,无需第一次注册可写事件
2、如何表明当前数据一次性没有发完?
send返回失败并且错误码是EWOULDBLOCK或EAGAIN,表示当前缓冲区已满,数据无法发出。
不一定第一次调用send就返回-1,有可能多次发送大量数据,可能返回-1;
3、剩下的数据应该缓存到哪里?
剩余的数据应该放入发送缓冲区
4、如果当前已经有部分数据发不出去,业务层又来新的数据了,这些新数据应该缓存在哪里?
新数据应该放在发送缓冲区,必须放在刚才未发完数据的后面
5、如果可写事件一直不触发,怎么办?有这种情况么?
有这种情况,有俩种场景。
第一种:滞留数据时间较长。比如:客户端断网、崩溃,服务器尝试发送,send一直返回EAGAIN
第二种:滞留的数据较大,比如:服务器每次发500个字节,客户端每次接收100个字节。
需要定时器,检测每个socket对应的发送缓冲区中的数据滞留情形,及时关闭链路。
留给读者留思考
1、上述5个问题对应的代码怎么写?
2、客户端给服务端发送一个包,然后再也不发送了,服务端需要怎么处理这个链接?
3、数据发送完,需要及时取消写事件(水平模式),为什么?
学习链接:https://github.com/0voice