基于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);
}
uj5u.com熱心網友回復:
constexpr static int kConnEvent = EPOLLET | EPOLLONESHOT | EPOLLRDHUP;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/282180.html
標籤:其它技術問題
