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);
}

...全文
1318 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
QPZME 05-02

constexpr static int kConnEvent = EPOLLET | EPOLLONESHOT | EPOLLRDHUP;
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3847

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2021-05-02 09:39
社区公告
暂无公告