微型个人博客服务器
Http相關(guān)簡介
Http是應(yīng)用層的基于請求響應(yīng)的一個協(xié)議, 其中Http的請求響應(yīng)可以分為四部分. 請求行, 請求報頭,空行, 請求正文.其中請求行包括了請求方法, url, 版本號, 請求報頭包括請求屬性, 冒分割的鍵值對, 每組屬性之間都以換行的形式分開, 最后一空行作為請求的結(jié)束標識. 最后一部分是請求正文.當請求正文存在的時候, 會在頭部信息中有一個Content_Length的屬性標識正文段的長度. 
 Http響應(yīng)也包括四部分, 響應(yīng)行, 響應(yīng)報頭, 空行, 響應(yīng)正文, 其中響應(yīng)行包括版本號, 狀態(tài)編號, 狀態(tài)描述, 響應(yīng)正文也是以key:value的形式存在, 其中每一個響應(yīng)屬性之間以換行為結(jié)束表示, 第三部分為空行, 最后一部分為響應(yīng)正文, 其中當響應(yīng)正文存在的時候, 響應(yīng)報頭中會存在一個Content_Length用來表示響應(yīng)正文的長度
網(wǎng)絡(luò)中數(shù)據(jù)的傳輸
客戶端發(fā)在瀏覽其中輸入一個url此時會經(jīng)過以下幾個步驟 
 1.客戶端在瀏覽器輸入一個url 
 2.瀏覽器查詢當前瀏覽器的緩存, 系統(tǒng)緩存, 路有緩存, 如果緩存中有用戶輸入的url就直接將內(nèi)容顯示給用戶, 如果沒有繼續(xù)查找 
 3.系統(tǒng)查找系統(tǒng)緩存, 查看是否有域名IP地址,如果有, 則繼續(xù)查找, 如果沒有, 繼續(xù)查看找 
 4.路由器查找路由緩存, 如果有對應(yīng)的IP地址則返回, 否則繼續(xù)查找 
 5.本地域名服務(wù)器采用迭代的方式進行查詢, 先向根域名服務(wù)器進行查詢 
 6.根域名服務(wù)器告訴本地域名服務(wù)器下一次應(yīng)該訪問的服務(wù)器的IP地址, 
 7.本地域名服務(wù)器拿著這個IP地址到頂級域名服務(wù)器訪問對應(yīng)的資源, 
 8.頂級域名服務(wù)器此時告訴本地域名服務(wù)器下一次應(yīng)該查詢的權(quán)限域名服務(wù)器的IP地址 
 9.本地域名服務(wù)器此時會向權(quán)限域名服務(wù)器進行訪問查詢 
 10.權(quán)限域名服務(wù)器告訴本地域名服務(wù)器所要查詢的資源對應(yīng)的主機的IP地址 
 11.此時本地域名服務(wù)器查詢到資源后將自己查詢到的IP地址告訴給主機 
 12.主機瀏覽器獲取到Web服務(wù)器的IP地址后,與服務(wù)器建立TCP連接 
 13.此時瀏覽器所在的客戶機 通過這個IP地址給對應(yīng)的服務(wù)器發(fā)送一個請求連接的報文 
 14.服務(wù)器接收到主機發(fā)來的請求后向客戶機發(fā)出對應(yīng)的應(yīng)答報文,同時也給客戶機發(fā)送一個請求連接報文 
 15.客戶機接收到這個請求后給服務(wù)器發(fā)送一個確認報文 
 16.此時客戶機和瀏覽器之間建立了連接完成, 開始通信 
 17.瀏覽器發(fā)出對應(yīng)的文件請求 
 18.服務(wù)器對瀏覽器發(fā)出的文件請求進行響應(yīng), 將用戶想要訪問的信息發(fā)送給瀏覽器 
 19.瀏覽器釋放連接, 向服務(wù)器發(fā)送一個FIN 報文 
 20.服務(wù)器接收到這個FIN報文的時候給對應(yīng)的客戶機發(fā)送一個ACK報文表名自己同意釋放鏈接, 同時服務(wù)器會給用戶發(fā)送一個FIN報文, 表名自己請求釋放連接 
 21.客戶機接收到FIN報文后給服務(wù)器發(fā)送一個ACK報文, 表名自己受到FIN報文, 
 22.連接釋放, 雙方停止發(fā)送數(shù)據(jù)
Http的特點
簡單快速, 服務(wù)器的規(guī)模小, 通信速度很快 
 Http允許傳輸任意類型的數(shù)據(jù)對象, 傳輸?shù)念愋陀蒀ontent_type標記 
 無連接, 每次連接只處理一個請求, 處理完請求后就進行關(guān)閉 
 協(xié)議本身不會保存用戶請求和響應(yīng)
URL & URI & URN
URI是一個統(tǒng)一資源標識符, 它只是一個資源的標示 
 URL 是一個更加具體的URI, 可以通過URL定位到該資源存放在哪里, 并且可以得知如何獲取到該資源.每個網(wǎng)頁都對應(yīng)一個URL地址(俗稱網(wǎng)址),具有全球唯一性。它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。 一個完整的URL包括協(xié)議類型、主機類型、路徑和文件名 
 URN 通過名字標識一個資源
Http請求方法
GET方法 
 如果瀏覽器訪問資源的方法是GET方法, 此時就會將用戶請求的關(guān)鍵字拼接到URL后面, 同時GET方法可能帶參數(shù)也可能不帶參數(shù) 
 POST方法 
 POST方法不會將用戶提交上去的數(shù)據(jù)放到url中, 它會將用戶提交上去的數(shù)據(jù)放到正文中
CGI
瀏覽器除了從服務(wù)器上獲取一些資源之外, 有時還需要向服務(wù)器上提交一些數(shù)據(jù), 為了實現(xiàn)網(wǎng)頁的交互性, 此時就需要以CGI機制來運行 
 當用戶訪問的資源具有可執(zhí)行的時候, 此時程序就要以CGI的形式進行運行, 其中CGI的運行有兩種可能, 一種是當請求的方法是POST, 另外一種就是當請求的資源是GET, 并且在URL中帶了參數(shù), 此時的運行方式即就是CGI運行方式
Http響應(yīng)狀態(tài)碼及其描述
2XX成功
200: 請求訪問被正確處理 
 204: 請求結(jié)果被正確處理, 但是響應(yīng)信息沒有響應(yīng)正文 
 206: 客戶端對服務(wù)器進行了范圍請求, 服務(wù)器成功執(zhí)行了GET 請求, 響應(yīng)報文包含了Content-Range指定的實體內(nèi)容范圍
3XX成功
瀏覽器為了正確出處理請求需要執(zhí)行一些特殊的處理動作 
 301永久性重定向:資源被重新分配了新的url, 要想訪問該資源就得以新的url去訪問資源 
 302臨時性重定向: 目標資源暫時被分配了新的url,需要訪問就得以新的url進行訪問
4XX客戶端錯誤
400 請求錯誤:表示請求報文中存在語法錯誤, 服務(wù)器無法解析該請求, 需要修改請求內(nèi)容, 重新發(fā)送. 
 403 瀏覽器訪問的資源被服務(wù)器拒絕. 服務(wù)器沒有必要給出詳細的理由 
 404 請求的資源不存在
5XX服務(wù)器錯誤
500 服務(wù)器端在執(zhí)行的時候發(fā)生了錯誤 
 503 服務(wù)器處于超載狀態(tài), 目前正在維護, 無法請求處理.
MySlq相關(guān)接口
mysql_get_client_info()//引入對應(yīng)的MySql庫 MySql* mysql_init(MySql* mysql);//初始化 MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char* db,unsigned int port,const char* unix_socket,unsigned long clientflag);//連接數(shù)據(jù)庫int mysql_query(MYSQL* mysql, const char* q);//下發(fā)MySql命令MYSQL_RES *mysql_store_result(MYSQL* mysql);//讀取結(jié)果unsigned int mysql_num_fields(MYSQL_RES *res);//獲取列數(shù)MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);//獲取列名void mysql_close(MYSQL* sock);//關(guān)閉MySql連接項目分析
1.用戶在瀏覽器上輸入一個url 
 2.服務(wù)器將用戶的請求進行分析, 向用戶發(fā)出Http響應(yīng), 最終將用戶請求的資源以一個html頁面展示給用戶 
 3.當用戶請求的資源是一個可執(zhí)行程序的時候, 此時就會進行簡單的cgi運行, 最終將運行的結(jié)果展示給用戶 
 4.當用戶輸入數(shù)據(jù), 服務(wù)器將對應(yīng)的數(shù)據(jù)插入到數(shù)據(jù)庫中 
 5.服務(wù)器將對應(yīng)的數(shù)據(jù)庫的信息以html頁面的格式展示給用戶
項目實現(xiàn)思路
1.創(chuàng)建套接字 
 2.將對應(yīng)的請求處理(將所有的換行都轉(zhuǎn)換為反斜杠n) 
 3.對讀取到的請求報文進行分析, 提取對應(yīng)的方法, 判斷該方法是GET 方法還是POST方法 
 4.如果是GET方法, 就直接判斷資源請求的資源是否存在, 資源如果存在, 就將該資源返回給用戶, 如果該資源不存在, 就返回404頁面, 如果請求的資源是一個目錄就將返回一個首頁給瀏覽器 
 5.如果是POST方法, 就以cgi機制運行, 同時將正文的長度獲取, 以進行參數(shù)獲取
項目中的CGI運行機制
首先判斷方法是GET 還是POST, 如果是GET方法, 那么此時的參數(shù)已經(jīng)獲取到(通過url放到了對應(yīng)的query_string 中)此時就將請求行請求正文全部讀完, 如果是POST方法, 此時就需要讀取請求報頭獲得Content_length, 通過Content_length獲取參數(shù).然后將發(fā)送響應(yīng)行首信息.此時就會出現(xiàn)一個問題, 既然是CGI機制, 那么就需要在一個集成中取執(zhí)行另一個可執(zhí)行程序, 此時就需要創(chuàng)建一個子進程, 但是子進程和父進程之間是獨立的, 父進程想要拿到子進程的運行結(jié)果就必須將兩個進程之間進行關(guān)聯(lián), 此時就需要引入管道實現(xiàn)進程間通信. 
 子進程需要執(zhí)行另外一個可執(zhí)行程序的話就需要程序替換, 程序替換回將當前的數(shù)據(jù)和代碼全部替換, 此時如果將其替換掉, 子進程還怎么拿到對應(yīng)的數(shù)據(jù), 這個時候就引入了環(huán)境變量, 為了讀寫方便, 將管道直接重定向到對應(yīng)的0和1中, 此時父進程只需要將子進程的執(zhí)行結(jié)果拿到之后將其交給瀏覽器即可, 子進程只需要從父進程那里將數(shù)據(jù)拿到即可 
 總結(jié)一下: 
 父進程: 
 創(chuàng)建兩個管道, 關(guān)閉相應(yīng)的文件描述符 
 POST:繼續(xù)讀取數(shù)據(jù), 直到讀完P(guān)OST的參數(shù)部分 
 GET直接從子進程那里讀取結(jié)果 
 將數(shù)據(jù)和方法全部交給子進程等待子進程結(jié)果 
 子進程: 
 關(guān)閉相應(yīng)的文件描述符 
 重定向標準輸入標準輸出 
 通過環(huán)境變量傳去參數(shù) 
 進程程序替換
錯誤處理
將對應(yīng)的請求處理完之后, 發(fā)出對應(yīng)的響應(yīng), 然后在正文中將404頁面發(fā)出去
部分圖片展示
 
  
  
  
  
  
  
  
 
總結(jié)
 
                            
                        - 上一篇: 幸福我们在路上剧情介绍
- 下一篇: 异界事务所团队副本在哪
