LT模式为什么同时支持阻塞和非阻塞?
如果LT模式是阻塞的,我们不用一次读完所有数据
epoll_wait会一直有数据,直到read buf为空,这种模式下首先不会丢失后处理的部分连接数据,其次当read buf 空时,由于我们只recv()一次,所以只会阻塞在epoll_wait 而不是recv(),所以只要有新的连接读、或者数据读。
ET模式为什么只支持非阻塞?
fd[1] == listen_sock ET模式下,一次没有处理完fd[1] read buf的全部链接请求数据,未处理的那部分的数据将会丢失,所以accept丢失。
ET模式下如果是阻塞的,由于同一读事件总的数据处理完成与否,只通知一次
所以应该是
for true { recv() }
这个时候才能读取完全部数据,但是这个时候当buf空时,会一直阻塞等待,进程挂起,新的accept不会得到相应,所以会丢失连接。
总结: LT 不会阻塞在recv(),所以阻塞非阻塞都可以
ET 会阻塞在recv(),所以只能非阻塞