renshangtao 2014-07-20 15:47 采纳率: 0%
浏览 1979

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,为什么要这么做呢,我如果不需要写数据呢!
请大神指点一下吧,非常感谢!

  • 写回答

1条回答

  • 小邓在路上 2014-07-24 08:58
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 关于无人驾驶的航向角
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了