weixin_38517428 2018-03-23 21:04 采纳率: 57.1%
浏览 1769
已结题

关于epoll的问题,发送缓冲区以及接受缓冲区?

本人刚学习epoll,向论坛大神问几个问题
本人理解,ET只有在文件描述符未就绪变为就绪时才会重新通过内核来告知,导致每一次的读取必须将缓冲区内数据读完,即处理完该事件
但是我们自己设定的用户空间缓冲区buf是有大小的,假如小于sockfd通告窗口大小,还是说我们会一般将用户空间的buf大小就写成和通告的窗口大小写成一致,则不存在,一次无法将缓冲区读完的情况发生
以下是tcp回射程序的部分

else if(events[i].events&EPOLLIN)
            {
                    if((sockfd=events[i].data.fd)<0)
                        continue;
                    while(rs)
                    {
                        if((n=read(sockfd,buf,MAXLINE))<0)
                        {
                            if(errno==ECONNRESET||errno=EAGAIN)
                            {
                                close(sockfd);
                                events[i].data.fd=-1;
                            }
                        else if(n==0)
                            {
                                close(sockfd);
                                events[i].data.fd=-1;
                            }

                        }
                        if(n==sizeof(buf))
                            rs=1;
                        else 
                            rs=0;
                    }
                    ev.data.fd=sockfd;
                    ev.events=EPOLLOUT|EPOLLET;
                    epoll_ctl(efd,EPOLL_CTL_MOD,sockfd,&ev);

            }

如何一直读sockfd,这是本人自己理解的 epoll但由于一直没有用epoll将该sockfd改成写,无法将buf内的数据写到sockfd,如何改正,或者如何正确的写出epoll函数,
我在网上找了很多种实现epoll的都并没有持续读直到无法读取那一部分的代码。一直不理解epoll如何实现这一过程,同理write过程也有这样一个问题,(若没写完buf内的内容必须持续写),但后面写的部分由于无法读取会覆盖前面写的部分,可能问题有些混乱,谢谢各位大神

  • 写回答

4条回答 默认 最新

  • 九叔疯了 2018-03-24 02:59
    关注

    1、tcp缓存区是内核管理的
    2、读取到没有缓存区的方法是将sockfd设置成非阻塞,然后循环读取直到返回无数据或者是超时错误。若需要持续读取数据则将sockfd再次放入epoll监听
    3、数据可能读不完整是需求靠应用层协议实现

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?