我正在尝试使用无阻塞套接字和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;
}
}
感谢您抽出宝贵的时间阅读。
答案 0 :(得分:0)
假设您的headerParse()方法不会以扩展大小的方式更改缓冲区(至少需要更新readsize,更不用说缓冲区已满的情况),看来您的write()路径是坏了。
如果您要写入的套接字也处于非阻塞模式,则在写入所有数据之前,write()返回-1(并将errno设置为EGAIN或EWOULDBLOCK或平台所具有的任何值)是完全合法的。 在这种情况下,您必须存储剩余数据(缓冲区的剩余数减去一个或多个对write()的调用成功后写入的内容),程序epoll通知clientHandler-> getFd()描述符是否具有可写性,当您收到后续的“写就绪”事件时,您将写入存储的数据。在这种情况下,write()可能再次无法刷新所有数据,因此您必须循环直到发送完所有数据。