epoll EPOLLONESHOT
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里,这样IN事件会被保留。EPOLLONESHOT区别就是,每次IN事件都是串行进行,而不是多个in事件并行。
ET模式与LT模式EPOLLONESHOT处理相同
(1)设置EPOLLONESHOT,创建线程读取,线程中不在将socket放入epoll队列,后续再发数据不触发in事件,无法读取。代码如下:
#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <iostream>
using namespace std;
#define MAX_EVENTS 10000
int epfd = 0;
void* process(void* ptr)
{
int sockfd = *(int*)ptr;
char buf;
while(read(sockfd, &buf, 1) > 0)
{
printf("%c\n",buf);
sleep(5);
}
cout << "thread out " << endl;
//event->events = EPOLLIN | EPOLLET;
//epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, event);
}
int main(int argc, char **argv)
{
short port = 6002; // default port
int listenFd = socket(AF_INET, SOCK_STREAM, 0);
int reuse = 1;
setsockopt(listenFd , SOL_SOCKET , SO_REUSEADDR , &reuse , sizeof(reuse));
fcntl(liste