最簡單版本的WebServer:緩存
1.服務端初始化工做:socket
a).建立主動套接字:initList(port)函數
b).轉爲監聽套接字:initList(port)blog
c).等候和接受鏈接:Accept(listenfd,&clientaddr,&sizeof(clientaddr));內存
2.處理客戶端的請求:資源
a).解析請求行:解析方法,URL,版本;根據URL決定是頁面屬性it
b).解析首部行cli
c).找到請求的資源List
d).發送客戶端請求資源循環
3.對IO的封裝:
首先構造了一個結構體Servbuf
結構體中,fd與socket文件相綁定,cnt表明當前Servbuf結構體的緩存區中剩餘的未讀字節數,ptr指向目前未讀的字節區域的第一個字節,buff爲一個MAXBUFFER大小的緩衝區。
構造這個結構體是由於,若是頻繁使用read來從socket文件中讀取數據進入內存則要頻繁切換內核,而若是直接將socket文件中的數據直接讀取MAXBUFFER到Servbuf中,則只用read切換一次,之後往內存中讀數據都只須要從Servbuf中經過memcpy便可,而不須要經過read來不斷切換。
readServbuf(Servbuf* servbuf,void* usrbuf,size_t n):
這個函數用於從servbuf中讀取n個字節到用戶指定區域usrbuf。
首先while循環用於判斷servbuf緩衝區中當前的數據量,若是小於等於0,說明上一次read的數據都已經轉移到用戶指定內存區域,須要再往Servbuf中"進一次貨",這一次讀取MAXBUFFER個數據,固然若是socket文件中剩餘數據量不足MAXBUFFER則讀取剩餘數量。
「補貨」完成後就是真正對Servbuf的讀取
num取爲要讀取的數量,取爲剩餘字節數和n中的較小值。
memcpy對數據進行轉移,同時操做cnt和ptr的更新。
int readServbufline(Servbuf* servbuf,void* usrbuf):
從Servbuf中讀取一行數據,主要用於對HTTP包中的請求行和狀態行進行讀取。
思路很簡單,buf爲用戶指向的區域,ptrack用於跟蹤每次讀取的一個字節是否爲'\n',\n時跳出,說明一行讀取完畢,返回n。