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 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题