开发者社区> 问答> 正文

Linux epoll 使用过程中的疑问,请专家给予指点一下

else if(events[i].events&EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入。
        {
            cout << "EPOLLIN" << endl;
            if ( (sockfd = events[i].data.fd) < 0)
                continue;
            if ( (n = read(sockfd, line, MAXLINE)) < 0) {
                if (errno == ECONNRESET) {
                    close(sockfd);
                    events[i].data.fd = -1;
                } else
                    std::cout<<"readline error"<<std::endl;
            } else if (n == 0) {
                close(sockfd);
                events[i].data.fd = -1;
            }
            line[n] = '/0';
            cout << "read " << line << endl;
            //设置用于写操作的文件描述符

            ev.data.fd=sockfd;
            //设置用于注测的写操作事件

            ev.events=EPOLLOUT|EPOLLET;
            //修改sockfd上要处理的事件为EPOLLOUT

            epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);

        }
        else if(events[i].events&EPOLLOUT) // 如果有数据发送

        {
            sockfd = events[i].data.fd;
            write(sockfd, line, n);
            //设置用于读操作的文件描述符

            ev.data.fd=sockfd;
            //设置用于注测的读操作事件

            ev.events=EPOLLIN|EPOLLET;
            //修改sockfd上要处理的事件为EPOLIN

            epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
        }

在这段程序中,接收过一次消息后,就将套接字描述符的事件模式设置为EPOLLOUT,为什么要这么做呢,我如果不需要写数据呢!
请大神指点一下吧,非常感谢!

展开
收起
云栖技术 2016-06-03 00:10:34 2147 0
1 条回答
写回答
取消 提交回答
  • 社区爱好者,专为云栖社区服务!

    这位位置的作用就是说明对此事件的具体的方向,你有事件刚刚接收进来,当然要设置成EPOLLIN,相反的,你马上要使用套接字往外发数据,那就设置成EPOLLOUT 啊 ,其实EPOLL很好用的,没什么意思,

    2019-07-17 19:25:42
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载