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

QPZME QPZME 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
基于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);
}

...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
QPZME
其它技术问题 3,881 成员 9,044 内容