epoll中的ET和LT模式的疑问

假设现在对方一口气发送了大量数据过来,以至于这边没法通过一次read就全部读取完毕。由于ET模式只会通知一次,所以这边对应的数据读取函数中不得不循环read多次,以保证把对方本次发送的数据全部读取完毕。比如说这样:while ((n = read(...)) \u0026gt; 0) { ....}否则如果你只read一次,那么剩下的那些数据可能就永远也没有通知了。由于上面那个循环的存在,文件描述符必须是非阻塞的。而LT模式会持续通知直到你把对方本次发送的数据全部读取完毕,所以这边对应的数据读取函数中只需要read一次就行了,而且绝对不会阻塞(此处不太准确)。=============================我评论区里关于阻塞模式下传入给read/write的buffer尺寸过大会导致阻塞的说法有问题。对于TCP来说,阻塞模式的read不会等到传入的buffer已经填满或遇到EOF了才返回,这跟普通磁盘文件的读取不太一样。但是TCP阻塞模式的write一般要等到buffer中所有数据都写入完毕才会返回。谢谢 @Kaleo Von的指正。


    推荐阅读