標準C語言編寫WebSever完成HTTP請求

2021-08-16 06:43:08 字數 2252 閱讀 4827

以 nginx 的思想來考慮本伺服器架構,初步考慮如下圖:

當然 php 程序也可以替換為其他的指令碼語言,可以更改原始碼中的 command 變數實現。

伺服器有乙個 master 程序,其有多個子程序為 worker 程序,master 程序受理客戶端的請求,然後分發給 worker 程序,worker 程序處理 http 頭資訊後將引數傳遞給 php 程序處理後,將結果返回到上層,再響應給客戶端。

也考慮過使用 php-fpm 的 worker 程序池方式,那樣的話 php-fpm 程序也要仿寫了,目前還不熟悉其內部構造,如果可以簡單化,自然向其靠攏。目前對 php 的 sapi 介面不熟,了解一下再考慮。

當前狀態的伺服器還極其簡單,總結下來有以下地方待優化:

雖然簡單,但伺服器已經有基本的功能了:

它監聽本地位址的 8080 埠,將接收到的 http 頭中的 path 資訊提出出來交給 php 程序,php 程序將引數資訊處理後返回給伺服器,伺服器拼裝 http 響應資訊再將結果返回給客戶端。

下面介紹各個功能的實現:

在介紹函式之間先用一張圖來介紹一次 http 請求中客戶端與伺服器之間的互動:

如圖:伺服器建立要進行:

呼叫 socket() 建立乙個連線;int socket(int domain, int type, int protocol);呼叫 bind() 給套接字命名,繫結埠;int bind( int socket, const struct sockaddr *address, size_t address_len);呼叫 listen() 監聽此套接字;int listen(int socket, int backlog);呼叫 accept() 接受客戶端的連線;int accept(int socket, struct sockaddr *address, size_t *address_len);呼叫 recv() 接收客戶端的資訊;int recv(int s, void *buf, int len, unsigned int flags);呼叫 send() 將響應資訊傳送給客戶端;int send(int s, const void * msg, int len, unsigned int falgs);

socket 間的接收和傳送資訊在 c 中有幾個系列:write() / read() 、send() / recv() 、sendto() / recvfrom()、 sendmsg() / recvmsg(),可以自行選用。

另外函式引數釋義和要點,都被我注釋在**中了,感興趣的可以拉下來看一下,這些在網上也多有介紹,這裡不再贅述。

在傳統的檔案傳輸裡面(read/write方式),在實現上其實是比較複雜的,需要經過多次上下文的切換,我們看一下如下兩行**:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

以上兩行**是傳統的read/write方式進行檔案到socket的傳輸。

當需要對乙個檔案進行傳輸的時候,其具體流程細節如下:

以上細節是傳統read/write方式進行網路檔案傳輸的方式,我們可以看到,在這個過程當中,檔案資料實際上是經過了四次copy操作:

硬碟—>核心buf—>使用者buf—>socket相關緩衝區—>協議引擎

而sendfile系統呼叫則提供了一種減少以上多次copy,提公升檔案傳輸效能的方法。sendfile系統呼叫是在2.1版本核心時引進的:

sendfile(socket, file, len);
執行流程如下:

相較傳統read/write方式,2.1版本核心引進的sendfile已經減少了核心緩衝區到user緩衝區,再由user緩衝區到socket相關 緩衝區的檔案copy,而在核心版本2.4之後,檔案描述符結果被改變,sendfile實現了更簡單的方式,系統呼叫方式仍然一樣,細節與2.1版本的 不同之處在於,當檔案資料被複製到核心緩衝區時,不再將所有資料copy到socket相關的緩衝區,而是僅僅將記錄資料位置和長度相關的資料儲存到 socket相關的快取,而實際資料將由dma模組直接傳送到協議引擎,再次減少了一次copy操作。

最後附上**

C語言標準

寫在前面 k r c不用說。個人以為,我們平常說的標準c,指的是ansi c,iso c,c89,c90。k r c ansi c和iso c c 的第乙個標準是由ansi發布的。雖然這份文件後來被國際標準化組織 iso 採納並且iso發布的修訂版也被ansi採納了,但名稱ansi c 而不是 is...

C語言標準

c語言標準 寫在前面 k r c不用說。個人以為,我們平常說的標準c,指的是ansi c,iso c,c89,c90。k r c 1978年,丹尼斯 里奇 dennis ritchie 和布萊恩 柯林漢 brian kernighan 合作出版了 c程式語言 的第一版。書中介紹的c語言標準也被c語言...

標準C語言

1 檔案相關 建立檔案 touch 檔名 原本是用來修改檔案屬性的,但如果檔案不存在 會自動把檔案建立出來。刪除檔案 rm 檔名 此命令刪除時不經過 站,檔案恢復困難。複製檔案 cp 原始檔 目標位置 在複製過程中可以修改檔名。移植檔案 mv 原始檔 目標位置 用法與cp基本一致,區別是cp原始檔還...