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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料