在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 0x13-套接字編程-HTTP服務(wù)器(1)
0x0E-單線程備份(下)
0x11-套接字編程-1
0x05-C語言指針:(Volume-1)
0x13-套接字編程-HTTP服務(wù)器(1)
0x0C-開始行動(dòng)
C 語言進(jìn)階
第一部分
0x05-C語言指針(Volume-2)
0x08-C語言效率(下)
0x07-C語言效率(上)
0x04 C代碼規(guī)范
0x0F-多線程備份
0x05-C語言變量
第四部分
0x16-套接字編程-HTTP服務(wù)器(4)
0x0D-單線程備份(上)
總結(jié)
0x01-C語言序言
0x15-套接字編程-HTTP服務(wù)器(3)
0x14-套接字編程-HTTP服務(wù)器(2)
0x17-套接字編程-HTTP服務(wù)器(5)
第三部分
我的C語言
0x06-C語言預(yù)處理器
0x09-未曾領(lǐng)略的新風(fēng)景
0x0A-C線程和Glib的視角
第二部分
0x10-網(wǎng)絡(luò)的世界
0x12-套接字編程-2
0x03-C代碼
0x0B-C語言錯(cuò)誤處理

0x13-套接字編程-HTTP服務(wù)器(1)

0x13-套接字編程-HTTP服務(wù)器(1)

這里不是百科全書,所以只會(huì)用最簡單,最明了的語言,來講最實(shí)用的TCP編程。

Echo程序太多,就不再重復(fù)了,貫穿整個(gè)章節(jié)的將會(huì)是一個(gè) HTTP 服務(wù)器

這回是在Linux下開發(fā),而不是Windows

TCP
  • 囫圇吞棗般的喂完UDP的基本應(yīng)用,以及一些API的使用,不再贅述TCP的使用,其實(shí)是很多我也不懂,(逃。
  • 但是,對(duì)于API我一向抱以用多少學(xué)多少知多少的態(tài)度,人生如戲,重在看戲啊。
  • 如果想要查找具體的完整的API可以先去查,UNIX網(wǎng)絡(luò)編程:卷1 + Linux Man手冊(cè),其中前者有一些部分實(shí)際上已經(jīng)過時(shí)(內(nèi)核版本跟不上)。更不用說后續(xù)加入Linux的一些接口,例如epoll。但是其他的接口還是可以參考的,并且十分的詳細(xì)。
  • TCP,這是一個(gè)極其復(fù)雜的協(xié)議,說復(fù)雜是因?yàn)樵谶@幾十年的發(fā)展中,對(duì)其的優(yōu)化已經(jīng)多到令人發(fā)指,于此而言,雖說即便不知道這些優(yōu)化也是可以編寫程序,但是建議還是能夠熟悉一下流程(兩端交互的過程)
    • 三次握手,四次揮手,擁塞控制,滑動(dòng)窗口機(jī)制。
    • 對(duì)于前兩個(gè)而言,我個(gè)人有不同見解,于為什么是三次握手,而不是其他次數(shù),但是由于并不一定被接受,所以我不在這里寫入,有興趣的可以Emali我一起討論,在面試的時(shí)候,我也是會(huì)和面試官討論這個(gè)問題,但一直沒有滿意的答案。

HTTP

  • 說了貫穿本章節(jié)的是一個(gè) HTTP服務(wù)器,如此就一定要說說 HTTP協(xié)議 了,如果說前面的TCP即使你不懂它的原理也能編寫一個(gè)能運(yùn)行且效率不錯(cuò)的TCP程序的話,那么想寫一個(gè)HTTP服務(wù)器,你要是不懂 HTTP協(xié)議,簡直是寸步難行。
  • 最權(quán)威的莫過于 《HTTP權(quán)威指南》,你可別想著去看HTTP的標(biāo)準(zhǔn)草案了,那真是神鬼難懂。當(dāng)然這本書亦是一部大塊頭,可以選擇在網(wǎng)上找一些HTTP協(xié)議的資料來補(bǔ)充一些基本知識(shí),再用這本大塊頭來檢索自己需要了解的地方。
  • 簡單說一下 HTTP 協(xié)議
    • 實(shí)際上這個(gè)協(xié)議就是 TCP協(xié)議在 應(yīng)用層 的一種封裝,換句話說 HTTP服務(wù)器實(shí)質(zhì)上還是一個(gè) TCP 程序,只不過 TCP協(xié)議 已經(jīng)被操作系統(tǒng)實(shí)現(xiàn)好,留出借口來給你調(diào)用,而 HTTP協(xié)議 則是完全需要你自己編寫。
    • 所謂協(xié)議就是雙方都需要遵守的一個(gè)規(guī)則,所以 HTTP協(xié)議 實(shí)質(zhì)上是一種非實(shí)際的東西,最主要的還是包括了一個(gè) 狀態(tài)機(jī),稱為 HTTP狀態(tài)機(jī) ,它的作用就是 解析/生成 HTTP報(bào)文,不必太過注意這些名詞,最開始想寫這個(gè)程序的時(shí)候,也沒有太多顧慮這種名詞性的東西。
    • 所有的名詞都是為了更好的抽象一件事物,就好比數(shù)學(xué)上的各種 符號(hào),其實(shí)本沒必要存在,但為了抽象簡單的表達(dá),符號(hào)就應(yīng)運(yùn)而生。所以當(dāng)你理解不了一個(gè)符號(hào)的時(shí)候,就跳過他,因?yàn)槟憧偰苷业揭粋€(gè)它的替代物(例如符號(hào)對(duì)應(yīng)的 公式/展開式,符號(hào)對(duì)應(yīng)的定理,定理對(duì)應(yīng)的實(shí)際例子),而且比他更加的詳細(xì)且好理解,這是我三年學(xué)習(xí)數(shù)學(xué)總結(jié)出來的經(jīng)驗(yàn)。
    • 扯了一些沒用的,回歸正題
  • 協(xié)議版本號(hào)

    • 主流的就是 HTTP/1.0, HTTP/1.1,其他的在編寫本程序時(shí)不必太在意
    • 需要了解的是這兩個(gè)版本好的一些功能區(qū)別,例如最廣為人知的Connection:的默認(rèn)屬性
  • 方法
    • GET
    • POST
    • HEAD
    • 實(shí)際上,在一般的服務(wù)器實(shí)現(xiàn)中,也只需要實(shí)現(xiàn)這三個(gè)方法就夠了,特別是前兩者比較重要,將以GET進(jìn)行程序的方法編寫,有興趣的可以自己實(shí)現(xiàn)POST方法,我的源代碼中也已經(jīng)完成一半了,但并不打算繼續(xù)完成。

有圖有真相

GET / HTTP/1.1\r\n          <--- 這是狀態(tài)行,包括一個(gè)請(qǐng)求方法,資源,協(xié)議版本
Host: www.wushxin.top\r\n   <-- 這是屬性頭,
Connection: keep-alive\r\n  <-- ...
\r\n                        <-- 一直到空行結(jié)束
  • 這是最簡單的HTTP請(qǐng)求報(bào)文,整個(gè)報(bào)文的意思是請(qǐng)求 資源根目錄(注意,是資源根目錄) 下的資源(默認(rèn) 請(qǐng)求根目錄且不寫什么資源就返回index.html),并希望與服務(wù)器保持連接

這里的保持連接和 TCP 協(xié)議中的保持連接不一樣,具體可以去查找資料,簡單來說這是一種不可靠的保持連接,雙方都可以在做出保證之后,突然斷開連接??梢园阉?dāng)成不靠譜連接,但是表面工作還是要做的。

有圖有真相

200 OK\r\n                  <-- 狀態(tài)行,包括一個(gè)狀態(tài)碼,狀態(tài)詳情
Host: www.wushxin.top\r\n   <-- 屬性,
Connection: close\r\n       <-- ...
Content-Length: 78\r\n      <-- 這個(gè)屬性,代表空行后面數(shù)據(jù)有多少
\r\n                        <-- 直到空行
<html><body><p>Hello, That is the Resource which you Request!</body></html>
  • 這是很簡單的一種返回報(bào)文,Content-Length屬性在這里特別重要!絕對(duì)不能缺少,它給對(duì)端一種信息就是,這個(gè)報(bào)文的結(jié)束位置在哪里。

  • 在上述報(bào)文中,每行的末尾都有\r\n這是HTTP協(xié)議 用來表達(dá)行末的一個(gè)標(biāo)志,而且,HTTP協(xié)議 的頭部和文本部有一個(gè)空行\r\n來進(jìn)行分割。

  • 以上就是所有我想要介紹的 HTTP協(xié)議的內(nèi)容,有些零散,還是建議去查找一些資料后再來往下看。

詳細(xì)計(jì)劃

  • 上面的內(nèi)容看起來有些零碎,但是做一個(gè)程序,還是需要理一理自己的思路。
  • 首先,我們的目的是做出一個(gè) 并發(fā)HTTP服務(wù)器, 會(huì)涉及到的知識(shí)點(diǎn):
    1. HTTP協(xié)議的實(shí)現(xiàn)
    2. TCP的Socket編程(即套接字編程),所謂網(wǎng)絡(luò)編程
    3. 多線程
    4. epoll 機(jī)制,暫時(shí)不要管selectpoll這兩個(gè)相似功能的機(jī)制
      • FastCGI的實(shí)現(xiàn)(作為擴(kuò)展,有興趣的在最后可以去嘗試,資源:FastCGI規(guī)范)