前言
之前关于介绍了EPOLLONESHOT:《inux服务器开发epoll的使用(EPOLLONESHOT的作用及如何使用)长连接短连接,粘包问题》;
设置EPOLLONESHOT的目的是为了防止同时使用套接字connfd,每次重新使用connfd使用EPOLL_CTL_MOD将其重新加入epoll队列中才能被epoll_wait();检测到;回顾一下为什么使用EPOLLONESHOT;
简单点来讲就是:同一时间不应该有多个工作线程使用同一个connfd,否则会产生网络错误;而EPOLLONESHOT就是避免这种网络错误的产生;
假如不使用EPOLLONESHOT,如果服务器有工作线程正在处理connfd,而此时又触发了connfd的对应事件如EPOLLIN,此时服务器主线程又会根据事件产生一个新的工作线程,该工作线程处理的同样是ocnnfd,这样会造成同一时间connfd被多个线程使用,这样会产生网络错误;
在网络编程这里为例:epoll检测到的套接字分为两种类型,connfd,和listenfd;
其中listenfd经过accept属性转化变为connfd;
而connfd通过从内核事件检测队列中移除变为listenfd;但是如果不close(connfd);其属性仍然会存在,这里引出了一个 错误码errno==EAGAIN;我们可以根据该错误判断类型然后通过EPOLL_CTL_MOD,然后改变connfd在epoll中的属性变为connfd类型;
关于LE模式和LT模式的区别
使用方式上:
事件属性具有