当前位置: 技术问答>linux和unix
对于epoll的疑惑,请高手帮忙解释一下
来源: 互联网 发布时间:2017-01-24
本文导语: 在学linux下的网络编程,现在看到epoll这一块,对EPOLLIN 和EPOLLOUT 这里有一点疑惑。从网上找到的代码如下,问题在代码后面 int main() { int i, maxi, listenfd, connfd, sockfd,epfd,nfds; ssize_t n; char line[M...
在学linux下的网络编程,现在看到epoll这一块,对EPOLLIN 和EPOLLOUT 这里有一点疑惑。从网上找到的代码如下,问题在代码后面
int main()
{
int i, maxi, listenfd, connfd, sockfd,epfd,nfds;
ssize_t n;
char line[MAXLINE];
socklen_t clilen;
//声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
struct epoll_event ev,events[20];
//生成用于处理accept的epoll专用的文件描述符
epfd=epoll_create(256);
struct sockaddr_in clientaddr;
struct sockaddr_in serveraddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
//把socket设置为非阻塞方式
setnonblocking(listenfd);
//设置与要处理的事件相关的文件描述符
ev.data.fd=listenfd;
//设置要处理的事件类型
ev.events=EPOLLIN|EPOLLET;
//ev.events=EPOLLIN;
//注册epoll事件
epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
char *local_addr="0.0.0.0";
inet_aton(local_addr,&(serveraddr.sin_addr));//htons(SERV_PORT);
serveraddr.sin_port=htons(SERV_PORT);
bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));
listen(listenfd, LISTENQ);
maxi = 0;
for ( ; ; ) {
static int last_fd = 0;
char empty[10240];
send(last_fd, empty, sizeof(empty), MSG_DONTWAIT);
//等待epoll事件的发生
nfds=epoll_wait(epfd,events,20,500);
//处理所发生的所有事件
for(i=0;i