Ver1:最簡單版本的WebServer

最簡單版本的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。

相關文章
相關標籤/搜索