我對Web服務器的基本原理感興趣,比如Apache或Nginx,所以現在我正在開發自己的服務器。是否可以直接從文件寫入套接字?
當我的服務器收到一個請求時,它正在搜索一個文件(例如index.html
),如果它存在 - 讀取緩衝區中的所有內容(content
)並將其寫入到套接字中。這裏有一個簡單的代碼:
int return_file(char* content, char* fullPath) {
file = open(fullPath, O_RDONLY);
if (file > 0) { // File was found, OK
while ((nread = read(file, content, 2048)) > 0) {}
close(file);
return 200;
}
}
的問題很簡單:是否有可能避免使用緩衝區並直接寫入文件內容的插座?
感謝您的任何提示:)
我從來沒有用過它,所以我不想寫一個答案,但看一看['splice'](https://linux.die.net/人/ 2 /拼接)。這裏的想法是做一個零拷貝傳輸,它至少可以節省將文件數據複製到用戶空間的時間,然後再回到內核空間,然後到達插槽。您可以更多地瞭解零拷貝概念,並且有來自Linus的信息性電子郵件交換,在那裏談論「拼接」。我在這裏與Linux交談,不確定微軟或其他人的作用是什麼。 – yano
@yano'splice'非常酷且一般,但在將文件發送到套接字的特定情況下,我相信'sendfile'更容易,效率更高。 – rici
@rici啊是的,我同意,當然更容易。我的猜測是'sendFile'在引擎蓋下使用'splice'(對於Linux而言),但我不知道。 – yano