久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何理解C語言編寫Http服務器中的Request

160次閱讀
沒有評論

共計 1763 個字符,預計需要花費 5 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關如何理解 C 語言編寫 Http 服務器中的 Request,文章內(nèi)容質(zhì)量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

制作流程

觀察收到的 http 數(shù)據(jù)

解析 request 的 method url version

解析 header

解析 body

觀察收到的 http 數(shù)據(jù)

如果你能完成一個簡單的基于 TCP/IP 的 socket server   程序,那么恭喜你,本文你可以好好讀一讀。HTTP 正式基于 TCP/IP 的應用層協(xié)議,所以只要我們的程序能讀懂 HTTP 數(shù)據(jù),并做出符合 HTTP 協(xié)議的響應,那么就能完成 HTTP 的通信。

如果你有機會,可以常識使用 telnet 連接我們的服務器,你將的得到得是一些沒有意義的字符。如果是瀏覽器,會傳送什么呢? 我們試著在瀏覽器地址欄輸入我們的服務器地址: 127.0.0.1:9734 后訪問,發(fā)現(xiàn)瀏覽器說“127.0.0.1 發(fā)送的響應無效。”,   那是說我們返回給瀏覽器的數(shù)據(jù)瀏覽器讀不懂,因為現(xiàn)代的瀏覽器默認用 http 協(xié)議請求訪問我們的服務器, 而我們的返回的數(shù)據(jù)只是 helloworld 字符串,并不符合 http 協(xié)議的返回格式。雖然如此, 但瀏覽器卻是很有誠意的給我們的服務器發(fā)標準的 http 請求,不信我們看下我們的服務器收到的信息:

先觀察一會兒, 看起來 *** 行是 http 請求的類型,第二行開始是一些 : 號分割的鍵值對。的確如此,*** 行告訴我們是用的 GET 請求,請求的 url 是 / , 用的是 1.1 的 HTTP 版本。第二行開始是 HTTP 的請求頭部。除了 GET 請求外,另一種常用的請求是 POST。用瀏覽器發(fā) POST 請求稍麻煩,我們就借用 curl 工具來發(fā)送個 HTTP  POST 請求給服務器看下數(shù)據(jù)又會是怎們樣的:curl -d message=nice to meet you  127.0.0.1:9734/hello

服務器收到的信息:

可以看到頭部信息之后多了一空行和之后的 POST 的 body 數(shù)據(jù)信息。還要注意的是 Content-Length 頭,代表 POST 的 body 數(shù)據(jù)的大小。

解析 request 的 method url version

先來解析最簡單的 *** 行: POST /hell HTTP/1.1 , 只需要用空格 split 出三個字符串就好了。

1.request.h

2.request.c

3. 編寫測試用例

在 test 目錄下執(zhí)行:` gcc ../request.h ../request.c requestTest.c  ./a.out`, 可以看到我們解析的方法正確。

解析 header

header 的解析看起來比較復雜,每一行很容易看出是用 : 分割的 key-value 對,所以我們可以用 HashMap 來表達。如何判斷 header 數(shù)據(jù)的結(jié)束呢,通過前面的觀察,可以發(fā)現(xiàn)如果是 POST 會有一個空行和 body 隔開,是 GET 的話只能檢查客戶端的數(shù)據(jù)是否發(fā)完,發(fā)完就代表 header 也結(jié)尾了。在正式解析 header 之前,我們先構(gòu)造基本數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),以方便以后使用。

1. 創(chuàng)建鏈表結(jié)構(gòu)體

2. 創(chuàng)建哈希表結(jié)構(gòu)體

3. 按行解析 header,遇到空行或字符串結(jié)尾停止

因為代碼比較多,這里不久不把兩種結(jié)構(gòu)體得實現(xiàn)代碼貼出來,如果足下需要可以私信我 代碼 獲取。

解析 header 代碼, 有了哈希結(jié)構(gòu)體后,解析 header 就方便多了,只要按行根據(jù) : 拆分成 key 和 value 就行了

關鍵代碼:

解析 body

解析 body 很簡單, 如果 *** 一行不是空格不是空行,說明是有 body 數(shù)據(jù)的,空行后面的就是 body 數(shù)據(jù)了.

header 里面有個關鍵的 key,lsquo;Content-Length rsquo; 代表了 body 有多長,我們可以利用這個字段來判斷 body 的結(jié)尾。

大功告成 *** 打印我們的成果

打印解析內(nèi)容

執(zhí)行 gcc request.h request.c main.c tools/utils.c tools/utils.h  ./a.out

然后新開一個終端執(zhí)行 curl -d message=nice to meet you  127.0.0.1:9734/hello-everyone

看到輸出結(jié)果:

關于如何理解 C 語言編寫 Http 服務器中的 Request 就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-25發(fā)表,共計1763字。
轉(zhuǎn)載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 搜索| 怀宁县| 方山县| 丹东市| 龙州县| 三河市| 吉安县| 响水县| 嘉定区| 本溪| 台南县| 赞皇县| 冷水江市| 泰顺县| 大英县| 潞城市| 黄冈市| 威信县| 冷水江市| 那曲县| 天全县| 溧水县| 雷州市| 且末县| 钦州市| 香港 | 雅安市| 石楼县| 漳州市| 永川市| 永胜县| 封开县| 丽水市| 象山县| 怀柔区| 会东县| 嵊泗县| 黔东| 广州市| 桃园市| 忻城县|