Epoll反向代理在编写客户端时卡住了

时间:2018-08-08 12:54:34

标签: c++ c sockets reverse-proxy epoll

我正在尝试使用无阻塞套接字和epoll编写反向代理。一开始似乎没问题,但是当我尝试打开一个大jpg文件时,我陷入了困境。 当我有时尝试写到客户端时,它可能无法写,并且我该如何处理正确的方法。

附加说明:

this->getFd() = ProxyFd
this->clientHandler->getFd = clientFd

我正在使用EPOLLET标记代理和客户端

   if( (flag & EPOLLIN) ){
        char buffer[1025] = {'\0'};
        int readSize;
        while( (readSize = read(this->getFd(),buffer,1024)) > 0){
            this->headerParse(buffer);
            this->readSize += readSize;
            int check = 0;
            do{
                check = write(this->clientHandler->getFd(),buffer,readSize);
            }while(check < 0);

        }
        if(this->headerEnd == 1 && this->readSize >= this->headerLenght  ){
            close(this->clientHandler->getFd());
            close(this->getFd());
            delete this->clientHandler;
            delete this;
        } 
    }

感谢您抽出宝贵的时间阅读。

1 个答案:

答案 0 :(得分:0)

假设您的headerParse()方法不会以扩展大小的方式更改缓冲区(至少需要更新readsize,更不用说缓冲区已满的情况),看来您的write()路径是坏了。

如果您要写入的套接字也处于非阻塞模式,则在写入所有数据之前,write()返回-1(并将errno设置为EGAIN或EWOULDBLOCK或平台所具有的任何值)是完全合法的。 在这种情况下,您必须存储剩余数据(缓冲区的剩余数减去一个或多个对write()的调用成功后写入的内容),程序epoll通知clientHandler-> getFd()描述符是否具有可写性,当您收到后续的“写就绪”事件时,您将写入存储的数据。在这种情况下,write()可能再次无法刷新所有数据,因此您必须循环直到发送完所有数据。