C++ HTTP服务器返大图片给浏览器后出现撕裂和显示不完整
基于epoll+非阻塞socket+边缘模式我实现了一个简单的http服务器,发送是调用write函数,接收是read函数。
我在测试小图片时浏览器显示正常,但是对于大图片(比如超过10M以上的)浏览器有时出现撕裂情况,有时正常,甚至还有显示一半的...
作为对比,我用python flask框架也实现了相同的图片浏览页面功能,flask确实是正常的,因此我确定是在C++ http服务器发送那一部分出现了问题,但是我不知道哪里出现了问题,有哪位大佬谁知道吗??
部分代码
我在测试小图片时浏览器显示正常,但是对于大图片(比如超过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);
}
...全文
相关推荐
指纹浏览器环境的导入、导出、快照与云端同步机制
现代指纹浏览器早已不再是单机版的“参数修改器”,而是演变成了一个**有状态的分布式身份管理系统**。环境不再是临时的进程,而是如同虚拟机般的持久化资产。 本文将深度拆解指纹浏览器环境的导入、导出、快照与云端同步机制,从 Chromium 底层存储拓扑到分布式一致性架构,讲述如何让数字身份在云端获得永生。
C++海康SDK逐帧存图:工业视觉图像采集闭环实现
逐帧存图是工业机器视觉中图像数据采集的基础技术,其本质是在高实时性约束下,从相机SDK直接获取原始图像帧并持久化存储。核心原理涉及SDK底层回调机制、内存零拷贝管理、线程安全队列与图像格式无损转换。该技术显著提升缺陷检测、自动聚焦、OCR训练等场景的数据时序精度与画质保真度,避免RTSP软解码导致的关键帧依赖和时间戳漂移。在C++环境下依托海康MVS或iCamera SDK实现,可满足30fps+稳定采集、微秒级时间戳命名、磁盘容错续存等工程刚需,是构建可靠视觉算法 pipeline 的关键数据入口。
mongodb-org-server_8.0.13_arm64.deb
mongodb-org-server_8.0.13_arm64
emqx-5.8.9-ubuntu20.04-arm64.deb
emqx-5.8.9-ubuntu20.04-arm64
binutils-2.17.90.tar.bz2
binutils-2.17.90.tar.bz2


其它技术问题
