日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

LwIP应用开发笔记之八:LwIP无操作系统HTTP客户端

發布時間:2024/7/23 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LwIP应用开发笔记之八:LwIP无操作系统HTTP客户端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面我們實現了TCP服務器和客戶端的簡單應用,接下來我們實現一個基于TCP協議的應用協議,那就是HTTP超文本傳輸協議

1HTTP協議簡介

超文本傳輸協議(Hyper Text Transfer Protocol),簡稱HTTP,是一種基于TCP的應用層協議,也是目前為止最為流行的應用層協議之一,可以說HTTP協議是萬維網的基石。

HTTP是一種客戶端請求、服務器應答式的應用層傳輸協議,也就是說服務器端是不可能主動向客戶端發送數據的。在網絡正常的情況下請求和響應都是一一對應的。而這個請求和響應也就是后端開發人員經常看到的Request和Response。

首先,我們來看客戶器端的請求,HTTP請求報文由請求行、請求頭、空白行以及請求體組成。其報文格式如下:

我們來說一說請求行,它由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。需要理解的是請求方法,HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT幾種。先對常用的幾種說明如下:

  • GET方法,意思是獲取URL指定的資源,這個請求方式是最簡單的也是最常用的。使用GET 方法時,可以將請求參數和對應的值附加在 URI 后面,利用一個問號(“?”)將資源的URI和請求參數隔開,參數之間使用與符號(“&”)隔開,因此傳遞參數長度也受到了限制,而且與隱私相關的信息也直接暴露在URI中。比如/index.jsp?username=holmofy&password=123123
  • HEAD方法,與GET用法相同,但沒有響應體,使用場合沒有GET多。比如下載前使用HEAD發送請求,通過ContentLength響應字段,來了解網絡資源的大小;或者通過LastModified響應字段來判斷本地緩存資源是否要更新。
  • POST方法,一般用提交信息或數據,請求服務器進行處理(例如提交表單或者上傳文件)。表單使用POST相對GET來說還是比較隱秘的,而且GET的URL有長度限制,而上傳大文件就必須要使用POST了。
  • OPTIONS方法,該方法用于請求服務器告知其支持哪些其他的功能和方法。通過OPTIONS 方法,可以詢問服務器具體支持哪些方法,或者服務器會使用什么樣的方法來處理一些特殊資源。可以說這是一個探測性的方法,客戶端通過該方法可以在不訪問服務器上實際資源的情況下就知道處理該資源的最優方式。這個選項在跨域HTTP請求的情況出現的比較多,這里有一片關于跨域請求的文章,其中有一張圖很好的解釋了什么是跨域HTTP請求。?

客戶端發出HTTP請求,服務端接收后,會向客戶端發送響應信息。所以接下來,我們來看看服務器端的響應報文。HTTP響應報文由響應行、響應頭、空白行以及響應體組成。其報文格式如下:

在響應報文中,非常重要的就是響應行,其中響應行中最重要的就是HTTP的狀態碼。HTTP協議中狀態碼有三位數字組成,第一位數字定義了響應的類別,有以下五種:

  • 1XX:信息提示。表示請求已被服務器接受,但需要繼續處理,范圍為100~101。
  • 2XX:請求成功。服務器成功處理了請求。范圍為200~206。
  • 3XX:客戶端重定向。重定向狀態碼用于告訴客戶端瀏覽器,它們訪問的資源已被移動,并告訴客戶端新的資源位置。客戶端收到重定向會重新對新資源發起請求。范圍為300~305。
  • 4XX:客戶端信息錯誤。客戶端可能發送了服務器無法處理的東西,比如請求的格式錯誤,或者請求了一個不存在的資源。范圍為400~415。
  • 5XX:服務器出錯。客戶端發送了有效的請求,但是服務器自身出現錯誤,比如Web程序運行出錯。范圍是500~505。

我們開發過程有一些狀態碼比較常見,我們對其簡單說明如下:

2HTTP客戶端設計

我們已經說過了,HTTP協議是基于TCP運行的,那么佷顯然我們要實現一個HTTP客戶端其本質上首先是要實現一個TCP客戶端。

在實現TCP客戶端的基礎上,我們要讓這個客戶端能夠實現HTTP協議的基本操作。所以我們需要為客戶端構造請求報文。關于請求報文的格式前面已經介紹過了,我們根據這個格式來構造,因為我們只是簡單的一個HTTP客戶端測試,所以我們采用GET方法。我們構造報文如下:

"GET https://www.cnblogs.com/foxclever/ HTTP/1.1\r\n"

"Host:www.cnblogs.com:80\r\n\r\n";

對于HTTP協議具有專門的端口號,所以我們采用這個制定的端口號來實現。而實現的流程與一般TCP客戶端是一樣的。

3HTTP客戶端實現

經過上述的分析以及我們前面實現TCP客戶端的經驗,實現HTTP客戶端已經沒有問題。與TCP客戶端一般,我們將HTTP客戶端分成4個函數來實現。首先依然是實現HTTP客戶端的初始化:

/* HTTP客戶端初始化配置*/void Http_Client_Initialization(void) {struct tcp_pcb *tcp_client_pcb;ip_addr_t ipaddr;/* 將目標服務器的IP寫入一個結構體,為pc機本地連接IP地址 */IP4_ADDR(&ipaddr,httpServerIP[0],httpServerIP[1],httpServerIP[2],httpServerIP[3]);/* 為tcp客戶端分配一個tcp_pcb結構體??? */tcp_client_pcb = tcp_new();/* 綁定本地端號和IP地址 */tcp_bind(tcp_client_pcb, IP_ADDR_ANY, TCP_HTTP_CLIENT_PORT);if (tcp_client_pcb != NULL){/* 與目標服務器進行連接,參數包括了目標端口和目標IP */tcp_connect(tcp_client_pcb, &ipaddr, TCP_HTTP_SERVER_PORT, HTTPClientConnected);tcp_err(tcp_client_pcb, HTTPClientConnectError);} }

我們很容易發現,上述初始化的代碼其實就是TCP客戶端的初始化代碼,除了所使用的端口不一樣外,其它都一樣。也是在初始化代碼中實現了兩個函數的注冊:一是使用tcp_connect注冊連接完成的處理回調函數;二是使用tcp_err注冊了連接錯誤處理回調函數。很明顯接下來我們需要實現這兩個函數。

連接到服務器成功后的回調函數是tcp_connected_fn類型。在客戶端建立一個連接后,內核會調用這個函數。在這個函數中,客戶端回想服務器發送最初的操作請求,并且會在這個函數中注冊數據接收處理回調函數。

/* HTTP客戶端連接到服務器回調函數 */ static err_t HTTPClientConnected(void *arg, struct tcp_pcb *pcb, err_t err) {char clientString[]="GET https://www.cnblogs.com/foxclever/ HTTP/1.1\r\n""Host:www.cnblogs.com:80\r\n\r\n";/* 配置接收回調函數 */tcp_recv(pcb, HTTPClientCallback);/* 發送一個建立連接的問候字符串*/tcp_write(pcb,clientString, strlen(clientString),0);return ERR_OK; }

這個代碼也是與普通TCP客戶端一樣,只是為了應用于HTTP協議,我們發送的請求字符串需要按照HTTP的格式來設定。對HTTP客戶端連接服務器錯誤回調函數,它是tcp_err_fn類型,在這個程序中主要完成連接異常結束時的一些處理,可以釋放一些必要的資源。在這個函數被內核調用時,連接實際上已經斷開,相關控制塊也已經被刪除。所以在這個函數中我們可以重新初始化連接及其資源。在這里我們就是使用它來重新初始化TCP客戶端。

/* HTTP客戶端連接服務器錯誤回調函數 */ static void HTTPClientConnectError(void *arg, err_t err) {/* 重新啟動連接 */Http_Client_Initialization(); }

最后我們需要實現的是HTTP客戶端接收到數據后的數據處理回調函數。這個函數其實就是我們前面連接成功時,注冊過的HTTP客戶端數據接收處理函數。這個函數是tcp_recv_fn類型。這是使用RAW API實現HTTP客戶端功能最重要的一個函數,因為它決定HTTP客戶端的具體功能。

/* HTTP客戶端接收到數據后的數據處理回調函數 */ static err_t HTTPClientCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err) {struct pbuf *tcp_send_pbuf;char echoString[]="GET https://www.cnblogs.com/foxclever/ HTTP/1.1\r\n""Host:www.cnblogs.com:80\r\n\r\n";if (tcp_recv_pbuf != NULL){/* 更新接收窗口 */tcp_recved(pcb, tcp_recv_pbuf->tot_len);/* 將接收到的服務器內容回顯*/tcp_write(pcb,echoString, strlen(echoString), 1);tcp_send_pbuf = tcp_recv_pbuf;tcp_write(pcb, tcp_send_pbuf->payload, tcp_send_pbuf->len, 1);pbuf_free(tcp_recv_pbuf);}else if (err == ERR_OK){tcp_close(pcb);Http_Client_Initialization();return ERR_OK;}return ERR_OK; }

同樣,這段代碼也是除了要按HTTP協議構造響應信息外,其他部分與普通TCP客戶端類似。

4、結論

與前一篇實現HTTP服務器是基于TCP服務器實現的一樣,這里我們實現HTTP客戶端是基于TCP客戶端來實現的。在我們前面已經實現TCP客戶端的情況下,開發HTTP客戶端應用就顯得簡單了。在這一篇我們基于LwIP實現了一個簡單的HTTP客戶端應用,我們并對其進行了簡單的測試。再歷程中我們只是實現了GET方法,但經測試設計是正確的。如果需要設計其他方法的HTTP應用只需在此基礎上添加即可。

歡迎關注:

總結

以上是生活随笔為你收集整理的LwIP应用开发笔记之八:LwIP无操作系统HTTP客户端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美久久天堂 | 亚洲一区视频在线 | 亚洲视频久久久 | 婷婷激情小说 | 偷拍中国夫妇高潮视频 | 精品中文字幕在线 | 国产精品23p | 少妇高潮a一级 | 91精品国产91久久久久福利 | 超能一家人电影免费喜剧在线观看 | 妞干网这里只有精品 | 影音先锋在线视频观看 | 久久精品屋| 日韩 欧美 亚洲 | 日韩福利在线播放 | 理论视频在线观看 | 在线免费看污网站 | 免费在线播放毛片 | 亚洲国产欧美另类 | 天天综合网在线观看 | 日韩欧美二区三区 | 四虎影视网 | 国产高清第一页 | 亚洲啊v| 蜜桃久久久 | 伦hdwww日本bbw另类 | 97国产精东麻豆人妻电影 | 中国黄色三级 | 国产精品国产三级国产aⅴ原创 | 国产精品久久久久不卡 | 一级黄色免费看 | 亚洲色图40p | 女人叫床很黄很污句子 | 午夜诱惑痒痒网 | 在线成人一区二区 | 国产免费自拍视频 | 精品久久BBBBB精品人妻 | 少妇又紧又色 | 中文文字幕文字幕高清 | 男操女视频网站 | 91精品国产亚洲 | 中文字幕+乱码+中文 | 电影《两个尼姑》免费播放 | 欧美另类综合 | 精品99久久久久成人网站免费 | 麻豆蜜桃视频 | 国产精品国语对白 | 日韩激情视频网站 | 色天天综合| 国产精品com | 九九热视频在线 | 一区二区三区色 | 午夜av网址| 裸体视频软件 | 国产久草av| 亚洲欧美激情另类 | 欧美极品jizzhd欧美 | 国内精品久久久久久久久久 | 日本极品丰满ⅹxxxhd | 亚洲色图20p| 亚洲老女人 | 久久精品色妇熟妇丰满人妻 | 最新中文字幕在线视频 | 欧洲成人综合 | 日韩精品在线观看一区二区三区 | 成人永久免费 | 东方欧美色图 | 夜夜嗨国产 | 色播亚洲 | 看黄网站在线观看 | 午夜家庭影院 | 欧美乱妇日本无乱码特黄大片 | 亚洲五月天综合 | 日少妇的逼 | 女性毛片| 2025中文字幕| 亚洲美女屁股眼交3 | 欧美俄罗斯乱妇 | 一区二区三区四区中文字幕 | 绯色av一区二区三区高清 | 在线视频福利 | 国产免费脚交足视频在线观看 | 在线观看免费福利 | 成人久草 | 日韩国产欧美综合 | 另类天堂av | 一级爱爱免费视频 | 亚洲自拍色图 | 男人喷出精子视频 | av片亚洲| 偷偷操不一样的久久 | 超碰xxx | 国产最新毛片 | 91精品人妻一区二区三区蜜桃欧美 | 91在线免费视频观看 | 日韩极品在线观看 | 色狠| 欧美巨大乳 | 日批免费看 |