C++ HTTP服务器返大图片给浏览器后出现撕裂和显示不完整

QPZME 2021-05-02 09:39:18
基于epoll+非阻塞socket+边缘模式我实现了一个简单的http服务器,发送是调用write函数,接收是read函数。
我在测试小图片时浏览器显示正常,但是对于大图片(比如超过10M以上的)浏览器有时出现撕裂情况,有时正常,甚至还有显示一半的...
作为对比,我用python flask框架也实现了相同的图片浏览页面功能,flask确实是正常的,因此我确定是在C++ http服务器发送那一部分出现了问题,但是我不知道哪里出现了问题,有哪位大佬谁知道吗??

部分代码

int TcpConnection::write(int *err) {
size_t len = sender_.readable(); // 可发送数据大小
int r_len = len;
int n = -1;
while (true) {
n = ::write(connfd_, sender_.peek() + len - r_len, r_len);

if (n < 0) {
*err = errno;
return n;
}
sender_.retired(n);
r_len -= n;
if (r_len <= 0) {
n = 0;
sender_.retired_all(); // 重置读写指针
break;
}
}
return n;
}


void TcpServer::on_write(TcpConnectionPtr conn) {
int err;
int n = conn->write(&err);
if (n == 0) {
if (conn->keep_alive()) {
if (conn->sender()->readable() == 0) {
mod_fd(conn->fd(), EPOLLIN | kConnEvent);
} else {
mod_fd(conn->fd(), EPOLLOUT | kConnEvent);
}
return;
}
} else if (n < 0) {
if (err == EAGAIN) {
// Continue sending messages
mod_fd(conn->fd(), EPOLLOUT | kConnEvent);
return;
}
}
handle_conn_close(conn);
}

...全文
1874 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大数据_clown 2022-10-27
  • 打赏
  • 举报
回复

请问楼主有解决问题吗?

QPZME 2021-05-02
  • 打赏
  • 举报
回复

constexpr static int kConnEvent = EPOLLET | EPOLLONESHOT | EPOLLRDHUP;

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧