深入理解計算機系統:網絡編程 下 一個簡單的web服務器

編寫一個web服務器的基礎是熟悉套接字接口。筆者因爲還沒有對其進行實踐,只對其有一些粗淺的瞭解。本文重點記錄一個web服務的核心功能主要由哪幾部分組成。

1. main函數

之前寫到,從客戶端到服務器的連接是主動的,服務器是在被動地等待一個客戶端對其發起連接請求,然後建立連接。所以,我們的服務器的main程序的核心功能就是有一個while循環,等待客戶端發起連接請求,然後接受請求,處理事務(diot),關閉連接它的另一端。

2. diot

首先,需要對客戶端發起請求的報頭進行分析。例如分析客戶端發起的是GET還是POST請求。等等。如果服務器不支持該請求方法,那就返回錯誤,關閉連接,等待下一個請求。如果服務器支持該方法,就分析CGI參數字符串(表明這是一個動態請求),並設定標誌位。最後,如果請求的是靜態內容,就向客戶端提供靜態內容;如果請求的是動態內容,就調用動態程序,返回動態內容。

3. serve_static

提供靜態內容,需要根據請求的URI確定訪問的文件名,然後根據文件名後綴判斷請求的文件類型。併發送響應報頭和響應主體給客戶端。響應主體就是通過讀取靜態文件,然後將文件描述符映射到存儲器,然後拷貝這個文件中的所有字節,來進行獲取的。

4. serve_dynamic

提供動態內容,需要派生一個子進程,並在子進程的上下文中運行一個CGI程序,來提供各種類型的動態內容。子進程通過請求URI獲取的CGI參數初始化QUERY——STRING環境變量。然後子進程重定向它的標準輸出到已連接文件描述符,然後加載並運行CGI程序。CGI運行的結果會直接顯示在服務器端。

總結

以上就是一個web服務器的基本功能中的核心功能,其它的還有錯誤處理,參數分析等等,這裏並沒有涉及。如果感興趣可以閱讀這本書的第11章。
正如貫穿這本書的核心思想之一:對於主機來講,網絡也是一個I/O設備。只不過可能讀取的文件在網絡上的某個別的機器上,但本質就是一種I/O。
希望這篇簡短的記錄能夠讓對網絡世界好奇的你有所幫助~路漫漫其修遠兮,吾將上下而求索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章