中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-10-27 15:58:32 來源:億速云 閱讀:410 作者:柒染 欄目:服務器

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

制作流程

  • 觀察收到的http數據

  • 解析 request 的 method url version

  • 解析 header

  • 解析 body

觀察收到的http數據

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

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

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

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

服務器收到的信息:

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

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

解析 request 的 method url version

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

1.request.h

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

2.request.c

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

3.編寫測試用例

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

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

解析 header

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

  • 1. 創建鏈表結構體

  • 2. 創建哈希表結構體

  • 3. 按行解析header,遇到空行或字符串結尾停止

因為代碼比較多,這里不久不把兩種結構體得實現代碼貼出來,如果足下需要可以私信我"代碼"獲取。

解析header代碼,有了哈希結構體后,解析header就方便多了,只要按行根據":" 拆分成 key和value就行了

關鍵代碼:

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

解析body

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

header里面有個關鍵的key, ‘Content-Length’ 代表了body有多長,我們可以利用這個字段來判斷body的結尾。

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

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

打印解析內容

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

執行 gcc request.h request.c main.c tools/utils.c tools/utils.h &&  ./a.out

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

看到輸出結果:

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广宗县| 宝丰县| 普宁市| 多伦县| 龙陵县| 皋兰县| 宾川县| 军事| 芦山县| 罗甸县| 诸城市| 大化| 增城市| 青阳县| 丹巴县| 义马市| 沁水县| 通河县| 丰镇市| 孝昌县| 涞水县| 贵州省| 大宁县| 北安市| 大安市| 万安县| 博罗县| 长顺县| 晋中市| 镇宁| 西吉县| 绩溪县| 句容市| 徐水县| 民勤县| 高要市| 铅山县| 新疆| 安化县| 万全县| 东源县|