深入理解计算机系统:网络编程 下 一个简单的web服务器
編寫(xiě)一個(gè)web服務(wù)器的基礎(chǔ)是熟悉套接字接口。筆者因?yàn)檫€沒(méi)有對(duì)其進(jìn)行實(shí)踐,只對(duì)其有一些粗淺的了解。本文重點(diǎn)記錄一個(gè)web服務(wù)的核心功能主要由哪幾部分組成。
1. main函數(shù)
之前寫(xiě)到,從客戶(hù)端到服務(wù)器的連接是主動(dòng)的,服務(wù)器是在被動(dòng)地等待一個(gè)客戶(hù)端對(duì)其發(fā)起連接請(qǐng)求,然后建立連接。所以,我們的服務(wù)器的main程序的核心功能就是有一個(gè)while循環(huán),等待客戶(hù)端發(fā)起連接請(qǐng)求,然后接受請(qǐng)求,處理事務(wù)(diot),關(guān)閉連接它的另一端。
2. diot
首先,需要對(duì)客戶(hù)端發(fā)起請(qǐng)求的報(bào)頭進(jìn)行分析。例如分析客戶(hù)端發(fā)起的是GET還是POST請(qǐng)求。等等。如果服務(wù)器不支持該請(qǐng)求方法,那就返回錯(cuò)誤,關(guān)閉連接,等待下一個(gè)請(qǐng)求。如果服務(wù)器支持該方法,就分析CGI參數(shù)字符串(表明這是一個(gè)動(dòng)態(tài)請(qǐng)求),并設(shè)定標(biāo)志位。最后,如果請(qǐng)求的是靜態(tài)內(nèi)容,就向客戶(hù)端提供靜態(tài)內(nèi)容;如果請(qǐng)求的是動(dòng)態(tài)內(nèi)容,就調(diào)用動(dòng)態(tài)程序,返回動(dòng)態(tài)內(nèi)容。
3. serve_static
提供靜態(tài)內(nèi)容,需要根據(jù)請(qǐng)求的URI確定訪問(wèn)的文件名,然后根據(jù)文件名后綴判斷請(qǐng)求的文件類(lèi)型。并發(fā)送響應(yīng)報(bào)頭和響應(yīng)主體給客戶(hù)端。響應(yīng)主體就是通過(guò)讀取靜態(tài)文件,然后將文件描述符映射到存儲(chǔ)器,然后拷貝這個(gè)文件中的所有字節(jié),來(lái)進(jìn)行獲取的。
4. serve_dynamic
提供動(dòng)態(tài)內(nèi)容,需要派生一個(gè)子進(jìn)程,并在子進(jìn)程的上下文中運(yùn)行一個(gè)CGI程序,來(lái)提供各種類(lèi)型的動(dòng)態(tài)內(nèi)容。子進(jìn)程通過(guò)請(qǐng)求URI獲取的CGI參數(shù)初始化QUERY——STRING環(huán)境變量。然后子進(jìn)程重定向它的標(biāo)準(zhǔn)輸出到已連接文件描述符,然后加載并運(yùn)行CGI程序。CGI運(yùn)行的結(jié)果會(huì)直接顯示在服務(wù)器端。
總結(jié)
以上就是一個(gè)web服務(wù)器的基本功能中的核心功能,其它的還有錯(cuò)誤處理,參數(shù)分析等等,這里并沒(méi)有涉及。如果感興趣可以閱讀這本書(shū)的第11章。
正如貫穿這本書(shū)的核心思想之一:對(duì)于主機(jī)來(lái)講,網(wǎng)絡(luò)也是一個(gè)I/O設(shè)備。只不過(guò)可能讀取的文件在網(wǎng)絡(luò)上的某個(gè)別的機(jī)器上,但本質(zhì)就是一種I/O。
希望這篇簡(jiǎn)短的記錄能夠讓對(duì)網(wǎng)絡(luò)世界好奇的你有所幫助~路漫漫其修遠(yuǎn)兮,吾將上下而求索。
總結(jié)
以上是生活随笔為你收集整理的深入理解计算机系统:网络编程 下 一个简单的web服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深入理解计算机系统:网络编程 上
- 下一篇: 我国近四成程序员单身 盘点各国IT从业者