是因为ET模式只在socket描述符状态发生变化时才触发事件,如果不一次把socket内核缓冲区的数据读完,会导致socket内核缓冲区中即使还有一部分数据,该socket的可读事件也不会被触发。因此一般使用下面这行代码循环读数据。
while( (len=recv(fd,buf,sizeof(buf),0)) > 0 )
如果文件IO设置为阻塞,则必然会阻塞在这里,造成没办法重新获取epoll_wait()事件。因此ET模式下文件IO一定要设置为非阻塞。
是因为ET模式只在socket描述符状态发生变化时才触发事件,如果不一次把socket内核缓冲区的数据读完,会导致socket内核缓冲区中即使还有一部分数据,该socket的可读事件也不会被触发。因此一般使用下面这行代码循环读数据。
while( (len=recv(fd,buf,sizeof(buf),0)) > 0 )
如果文件IO设置为阻塞,则必然会阻塞在这里,造成没办法重新获取epoll_wait()事件。因此ET模式下文件IO一定要设置为非阻塞。