微型個人博客服務器

Http相關簡介

Http是應用層的基于請求響應的一個協議, 其中Http的請求響應可以分為四部分. 請求行, 請求報頭,空行, 請求正文.其中請求行包括了請求方法, url, 版本號, 請求報頭包括請求屬性, 冒分割的鍵值對, 每組屬性之間都以換行的形式分開, 最后一空行作為請求的結束標識. 最后一部分是請求正文.當請求正文存在的時候, 會在頭部信息中有一個Content_Length的屬性標識正文段的長度.
Http響應也包括四部分, 響應行, 響應報頭, 空行, 響應正文, 其中響應行包括版本號, 狀態編號, 狀態描述, 響應正文也是以key:value的形式存在, 其中每一個響應屬性之間以換行為結束表示, 第三部分為空行, 最后一部分為響應正文, 其中當響應正文存在的時候, 響應報頭中會存在一個Content_Length用來表示響應正文的長度

網絡中數據的傳輸

客戶端發在瀏覽其中輸入一個url此時會經過以下幾個步驟
1.客戶端在瀏覽器輸入一個url
2.瀏覽器查詢當前瀏覽器的緩存, 系統緩存, 路有緩存, 如果緩存中有用戶輸入的url就直接將內容顯示給用戶, 如果沒有繼續查找
3.系統查找系統緩存, 查看是否有域名IP地址,如果有, 則繼續查找, 如果沒有, 繼續查看找
4.路由器查找路由緩存, 如果有對應的IP地址則返回, 否則繼續查找
5.本地域名服務器采用迭代的方式進行查詢, 先向根域名服務器進行查詢
6.根域名服務器告訴本地域名服務器下一次應該訪問的服務器的IP地址,
7.本地域名服務器拿著這個IP地址到頂級域名服務器訪問對應的資源,
8.頂級域名服務器此時告訴本地域名服務器下一次應該查詢的權限域名服務器的IP地址
9.本地域名服務器此時會向權限域名服務器進行訪問查詢
10.權限域名服務器告訴本地域名服務器所要查詢的資源對應的主機的IP地址
11.此時本地域名服務器查詢到資源后將自己查詢到的IP地址告訴給主機
12.主機瀏覽器獲取到Web服務器的IP地址后,與服務器建立TCP連接
13.此時瀏覽器所在的客戶機 通過這個IP地址給對應的服務器發送一個請求連接的報文
14.服務器接收到主機發來的請求后向客戶機發出對應的應答報文,同時也給客戶機發送一個請求連接報文
15.客戶機接收到這個請求后給服務器發送一個確認報文
16.此時客戶機和瀏覽器之間建立了連接完成, 開始通信
17.瀏覽器發出對應的文件請求
18.服務器對瀏覽器發出的文件請求進行響應, 將用戶想要訪問的信息發送給瀏覽器
19.瀏覽器釋放連接, 向服務器發送一個FIN 報文
20.服務器接收到這個FIN報文的時候給對應的客戶機發送一個ACK報文表名自己同意釋放鏈接, 同時服務器會給用戶發送一個FIN報文, 表名自己請求釋放連接
21.客戶機接收到FIN報文后給服務器發送一個ACK報文, 表名自己受到FIN報文,
22.連接釋放, 雙方停止發送數據

Http的特點

簡單快速, 服務器的規模小, 通信速度很快
Http允許傳輸任意類型的數據對象, 傳輸的類型由Content_type標記
無連接, 每次連接只處理一個請求, 處理完請求后就進行關閉
協議本身不會保存用戶請求和響應

URL & URI & URN

URI是一個統一資源標識符, 它只是一個資源的標示
URL 是一個更加具體的URI, 可以通過URL定位到該資源存放在哪里, 并且可以得知如何獲取到該資源.每個網頁都對應一個URL地址(俗稱網址),具有全球唯一性。它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。 一個完整的URL包括協議類型、主機類型、路徑和文件名
URN 通過名字標識一個資源

Http請求方法

GET方法
如果瀏覽器訪問資源的方法是GET方法, 此時就會將用戶請求的關鍵字拼接到URL后面, 同時GET方法可能帶參數也可能不帶參數
POST方法
POST方法不會將用戶提交上去的數據放到url中, 它會將用戶提交上去的數據放到正文中

CGI

瀏覽器除了從服務器上獲取一些資源之外, 有時還需要向服務器上提交一些數據, 為了實現網頁的交互性, 此時就需要以CGI機制來運行
當用戶訪問的資源具有可執行的時候, 此時程序就要以CGI的形式進行運行, 其中CGI的運行有兩種可能, 一種是當請求的方法是POST, 另外一種就是當請求的資源是GET, 并且在URL中帶了參數, 此時的運行方式即就是CGI運行方式

Http響應狀態碼及其描述

2XX成功

200: 請求訪問被正確處理
204: 請求結果被正確處理, 但是響應信息沒有響應正文
206: 客戶端對服務器進行了范圍請求, 服務器成功執行了GET 請求, 響應報文包含了Content-Range指定的實體內容范圍

3XX成功

瀏覽器為了正確出處理請求需要執行一些特殊的處理動作
301永久性重定向:資源被重新分配了新的url, 要想訪問該資源就得以新的url去訪問資源
302臨時性重定向: 目標資源暫時被分配了新的url,需要訪問就得以新的url進行訪問

4XX客戶端錯誤

400 請求錯誤:表示請求報文中存在語法錯誤, 服務器無法解析該請求, 需要修改請求內容, 重新發送.
403 瀏覽器訪問的資源被服務器拒絕. 服務器沒有必要給出詳細的理由
404 請求的資源不存在

5XX服務器錯誤

500 服務器端在執行的時候發生了錯誤
503 服務器處于超載狀態, 目前正在維護, 無法請求處理.

MySlq相關接口

mysql_get_client_info()//引入對應的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);//連接數據庫int mysql_query(MYSQL* mysql, const char* q);//下發MySql命令MYSQL_RES *mysql_store_result(MYSQL* mysql);//讀取結果unsigned int mysql_num_fields(MYSQL_RES *res);//獲取列數MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);//獲取列名void mysql_close(MYSQL* sock);//關閉MySql連接

項目分析

1.用戶在瀏覽器上輸入一個url
2.服務器將用戶的請求進行分析, 向用戶發出Http響應, 最終將用戶請求的資源以一個html頁面展示給用戶
3.當用戶請求的資源是一個可執行程序的時候, 此時就會進行簡單的cgi運行, 最終將運行的結果展示給用戶
4.當用戶輸入數據, 服務器將對應的數據插入到數據庫中
5.服務器將對應的數據庫的信息以html頁面的格式展示給用戶

項目實現思路

1.創建套接字
2.將對應的請求處理(將所有的換行都轉換為反斜杠n)
3.對讀取到的請求報文進行分析, 提取對應的方法, 判斷該方法是GET 方法還是POST方法
4.如果是GET方法, 就直接判斷資源請求的資源是否存在, 資源如果存在, 就將該資源返回給用戶, 如果該資源不存在, 就返回404頁面, 如果請求的資源是一個目錄就將返回一個首頁給瀏覽器
5.如果是POST方法, 就以cgi機制運行, 同時將正文的長度獲取, 以進行參數獲取

項目中的CGI運行機制

首先判斷方法是GET 還是POST, 如果是GET方法, 那么此時的參數已經獲取到(通過url放到了對應的query_string 中)此時就將請求行請求正文全部讀完, 如果是POST方法, 此時就需要讀取請求報頭獲得Content_length, 通過Content_length獲取參數.然后將發送響應行首信息.此時就會出現一個問題, 既然是CGI機制, 那么就需要在一個集成中取執行另一個可執行程序, 此時就需要創建一個子進程, 但是子進程和父進程之間是獨立的, 父進程想要拿到子進程的運行結果就必須將兩個進程之間進行關聯, 此時就需要引入管道實現進程間通信.
子進程需要執行另外一個可執行程序的話就需要程序替換, 程序替換回將當前的數據和代碼全部替換, 此時如果將其替換掉, 子進程還怎么拿到對應的數據, 這個時候就引入了環境變量, 為了讀寫方便, 將管道直接重定向到對應的0和1中, 此時父進程只需要將子進程的執行結果拿到之后將其交給瀏覽器即可, 子進程只需要從父進程那里將數據拿到即可
總結一下:
父進程:
創建兩個管道, 關閉相應的文件描述符
POST:繼續讀取數據, 直到讀完POST的參數部分
GET直接從子進程那里讀取結果
將數據和方法全部交給子進程等待子進程結果
子進程:
關閉相應的文件描述符
重定向標準輸入標準輸出
通過環境變量傳去參數
進程程序替換

錯誤處理

將對應的請求處理完之后, 發出對應的響應, 然后在正文中將404頁面發出去

部分圖片展示

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HDU6428-Calculate-數論函數

并不知道為什么同樣一份代碼早上超時下午就A了…好像數據是隨機的? 做的第一道不是簡單板題的數論函數題.果然做不出來… 在網上研究了好久,才算稍微研究明白.看到了兩種推導的思路.(寫了半天發現講起來好麻煩,有時間再來更新) #include<cstdio> #include<cstring&g…

[C/C++]關于C++11中的std::move和std::forward

http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.htmlstd::move是一個用于提示優化的函數&#xff0c;過去的c98中&#xff0c;由于無法將作為右值的臨時變量從左值當中區別出來&#xff0c;所以程序運行時有大量臨時變量白白的創建后又立刻銷毀&#xff0c;其中又尤其是返回…

BZOJ3930-莫比烏斯反演+杜教篩

題目的意思很簡單&#xff0c;求給定區間內的gcdk的個數&#xff0c;這應該是傳統的莫比烏斯反演了。 有兩種思路&#xff0c;一種是直接將里面變成gcd1&#xff0c;然后里面看作元函數用莫比烏斯函數和恒等函數展開&#xff0c;然后改變求和順序。 還有一種是構造兩個函數&…

HDU1999不可摸數-暴力打表

看到這約數和第一反應是約數和函數&#xff0c;然后仔細一看不是正經的約數和函數&#xff0c;就去推去了&#xff0c;然后推的有點小復雜。&#xff08;數論函數那部分做多了&#xff09; 然后觀察也沒有用到什么數論部分的特殊知識啊&#xff0c;難不成真的要暴力&#xff1f…

BZOJ2818-莫比烏斯反演/歐拉函數

這道題之前沒有看數論函數的時候搞懂了,想到直接用歐拉函數做,現在再來看第一個想法就是這不是莫比烏斯反演嘛. 但還是能用簡單數論知識直接做出來的還是盡量做簡單一點. 兩種方法想到后都寫的差不多對了,都爆long long 了.萬惡的long long .實在是煩.切記切記,只要是乘積,或…

epoll用法整理 實現回聲服務端

http://blog.csdn.net/chenxun_2010/article/details/504934811、epoll是什么&#xff1f; epoll是當前在Linux下開發大規模并發網絡程序的熱門人選&#xff0c;epoll 在Linux2.6內核中正式引入&#xff0c;和select相似&#xff0c;都是I/O多路復用(IO multiplexing)技術。 Li…

HDU3430-擴展中國剩余定理

剛開始一直把題意看錯了。。。體測完智商急劇下降 正確理解題意以后自己寫一直wa&#xff0c;而且并不知道是哪里的問題&#xff0c;在網上看了一下其他人寫的改了改自己的就過了&#xff0c;可是之前的還是不知道為什么不對。 題意大概就是有一個置換群&#xff0c;問運算多…

linux shell編程多線程和wait命令學習

http://blog.csdn.net/shuanghujushi/article/details/38186303最近在使用shell做一些部署工作&#xff0c;在使用過程中&#xff0c;效率一直不高。想提高效率&#xff0c;經過分析發現&#xff0c;并不是所有操作都是需要串行的&#xff0c;一些操作是可以進行并行操作的。經…

#ifndef的作用

#ifndef是一條預編譯指令&#xff0c;就是說實在編譯的時候就會運行的指令。這個指令的作用很簡單&#xff0c;就是字面意思&#xff0c;如果沒有定義的話&#xff0c;但是卻經常使用。 因為使用這個可以避免一個源文件中兩次兩次包含同一個文件&#xff0c;或者一個工程文件中…

C++中結構體和類的區別和聯系

最主要的不同點就是結構體的訪問權限為public而且不能改變&#xff0c;而類的訪問權限可以改變&#xff0c;public的類和結構體基本一樣。 繼承上同樣表現出這樣的特點&#xff0c;struct是public繼承的&#xff0c;而class是private繼承的&#xff0c;繼承的子類的訪問權限取…

poll函數實現多路復用

http://blog.csdn.net/xluren/article/details/8206371 結構體pollfd struct pollfd { int fd; //file descriptor short event; //event of interest on fd short reven; //event that occurred on fd } 每一個pollfd結構體指定了一個被監視的文件描述符&…

抽象類(純虛函數、虛函數)和虛基類(虛繼承)

C多態 C的多態包括靜態多態和動態多態&#xff0c;靜態多態包括函數重載和泛型編程&#xff0c;動態多態包括虛函數。靜態多態實在編譯期間就能確定&#xff0c;動態多態實直在程序運行時才能確定。 抽象類 虛函數 在默認情況下對函數成員調用實施的是靜態連編&#xff0c;…

socket通信之最簡單的socket通信

http://blog.csdn.net/xluren/article/details/8043484#t15 套接字有三種類型 流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;數據報套接字&#xff08;SOCK_DGRAM&#xff09;及原始套接字。 1.流式套接字提供面向連接、可靠的數據傳輸服務&#xff0c;數據按字節…

Java環境配置

自己安裝的時候按照一般的安裝方法先配置了JDK的環境&#xff0c;能夠成功顯示java版本后我在安裝eclipse的時候一直提示錯誤&#xff1a; Unfortunately the Java version needed to run Eclipse Installer couldn’t be found on your system. You need the following versio…

Linux I/O復用之select函數詳解

http://blog.csdn.net/y396397735/article/details/55004775 select函數的功能和調用順序 使用select函數時統一監視多個文件描述符的&#xff1a; 1、 是否存在套接字接收數據&#xff1f; 2、 無需阻塞傳輸數據的套接字有哪些? 3、 哪些套接字發生了異常&#xff1f; sel…

【Java學習筆記一】類和對象

面向對象程序設計的一個一個重要特點是&#xff1a;封裝性。 這里的封裝性有兩方面含義&#xff1a;一是將有關的數據和操作代碼封裝在一個對象中形成一個基本單位&#xff0c;各個對象之間相互獨立互不干擾&#xff0c;二是將對象中某些部分對外隱蔽&#xff0c;即隱蔽其內部細…

深入研究socket編程(3)——使用select函數編寫客戶端和服務器

http://blog.csdn.net/chenxun_2010/article/details/50488394 首先看原先《UNIX網絡編程——并發服務器&#xff08;TCP&#xff09;》的代碼&#xff0c;服務器代碼serv.c&#xff1a; [cpp] view plaincopy #include<stdio.h> #include<sys/types.h> #inclu…

Java簡單輸入輸出

不同于面向過程中有直接的輸入輸出函數&#xff0c;Java中的輸入輸出只能通過類來實現。 比較常見的一種是使用Scanner類 需要引入java.util包&#xff0c;即在文件開始加上語句import java.util.*;創建Scanner類對象&#xff0c;屬于標準輸入流。 例如Scanner snew Scanner(S…

Ubuntu安裝搭建Clion環境

嗚嗚嗚&#xff0c;太辛苦了&#xff0c;我終于安裝好這個了。 大概過程就是先在官網下載安裝包&#xff0c;然后解壓以后用終端移動到對應文件夾下運行clin.sh 運行完以后會有一些窗口&#xff0c;第一個選擇don’t~~&#xff0c;然后點擊ok 接受&#xff08;你可以不接受…

UNIX網絡編程——select函數的并發限制和 poll 函數應用舉例

http://blog.csdn.net/chenxun_2010/article/details/50489577 一、用select實現的并發服務器&#xff0c;能達到的并發數&#xff0c;受兩方面限制 1、一個進程能打開的最大文件描述符限制。這可以通過調整內核參數。可以通過ulimit -n來調整或者使用setrlimit函數設置&#x…