在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于LwIP的HTTP服務(wù)器設(shè)計(jì)

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 15:15 ? 次閱讀

前面我們實(shí)現(xiàn)了TCP服務(wù)器和客戶端的簡(jiǎn)單應(yīng)用,接下來(lái)我們實(shí)現(xiàn)一個(gè)基于TCP協(xié)議的應(yīng)用協(xié)議,那就是HTTP超文本傳輸協(xié)議

1 、 ** HTTP****協(xié)議簡(jiǎn)介**

超文本傳輸協(xié)議(Hyper Text Transfer Protocol),簡(jiǎn)稱(chēng)HTTP,是一種基于TCP的應(yīng)用層協(xié)議,也是目前為止最為流行的應(yīng)用層協(xié)議之一,可以說(shuō)HTTP協(xié)議是萬(wàn)維網(wǎng)的基石。

HTTP是一種客戶端請(qǐng)求、服務(wù)器應(yīng)答式的應(yīng)用層傳輸協(xié)議,也就是說(shuō)服務(wù)器端是不可能主動(dòng)向客戶端發(fā)送數(shù)據(jù)的。在網(wǎng)絡(luò)正常的情況下請(qǐng)求和響應(yīng)都是一一對(duì)應(yīng)的。而這個(gè)請(qǐng)求和響應(yīng)也就是后端開(kāi)發(fā)人員經(jīng)??吹降腞equest和Response。

首先,我們來(lái)看客戶器端的請(qǐng)求,HTTP請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭、空白行以及請(qǐng)求體組成。其報(bào)文格式如下:

我們來(lái)說(shuō)一說(shuō)請(qǐng)求行,它由請(qǐng)求方法字段、URL字段和HTTP協(xié)議版本字段3個(gè)字段組成,它們用空格分隔。需要理解的是請(qǐng)求方法,HTTP協(xié)議的請(qǐng)求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT幾種。先對(duì)常用的幾種說(shuō)明如下:

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

客戶端發(fā)出HTTP請(qǐng)求,服務(wù)端接收后,會(huì)向客戶端發(fā)送響應(yīng)信息。所以接下來(lái),我們來(lái)看看服務(wù)器端的響應(yīng)報(bào)文。HTTP響應(yīng)報(bào)文由響應(yīng)行、響應(yīng)頭、空白行以及響應(yīng)體組成。其報(bào)文格式如下:

在響應(yīng)報(bào)文中,非常重要的就是響應(yīng)行,其中響應(yīng)行中最重要的就是HTTP的狀態(tài)碼。HTTP協(xié)議中狀態(tài)碼有三位數(shù)字組成,第一位數(shù)字定義了響應(yīng)的類(lèi)別,有以下五種:

  • 1XX 信息提示。表示請(qǐng)求已被服務(wù)器接受,但需要繼續(xù)處理,范圍為100~101。
  • 2XX 請(qǐng)求成功。服務(wù)器成功處理了請(qǐng)求。范圍為200~206。
  • 3XX:客戶端重定向。重定向狀態(tài)碼用于告訴客戶端瀏覽器,它們?cè)L問(wèn)的資源已被移動(dòng),并告訴客戶端新的資源位置。客戶端收到重定向會(huì)重新對(duì)新資源發(fā)起請(qǐng)求。范圍為300~305。
  • 4XX 客戶端信息錯(cuò)誤。客戶端可能發(fā)送了服務(wù)器無(wú)法處理的東西,比如請(qǐng)求的格式錯(cuò)誤,或者請(qǐng)求了一個(gè)不存在的資源。范圍為400~415。
  • 5XX:服務(wù)器出錯(cuò)??蛻舳税l(fā)送了有效的請(qǐng)求,但是服務(wù)器自身出現(xiàn)錯(cuò)誤,比如Web程序運(yùn)行出錯(cuò)。范圍是500~505。

我們開(kāi)發(fā)過(guò)程有一些狀態(tài)碼比較常見(jiàn),我們對(duì)其簡(jiǎn)單說(shuō)明如下:

2 、 ** HTTP****服務(wù)器端的設(shè)計(jì)**

我們已經(jīng)對(duì)基于RAW API的TCP應(yīng)用有了了解。我們?cè)趯?shí)現(xiàn)TCP服務(wù)器的實(shí)驗(yàn)時(shí)就提到過(guò)對(duì)于更復(fù)雜的應(yīng)用和應(yīng)用層協(xié)議只是在功能上的差別,從實(shí)現(xiàn)的結(jié)構(gòu)及流程來(lái)說(shuō)是完全一致的。所以對(duì)于實(shí)現(xiàn)HTTP服務(wù)器需要使用到的函數(shù)及整個(gè)操作流程我們就不再敘述了。重點(diǎn)說(shuō)一說(shuō)不同的地方。

首先HTTP服務(wù)器是基于TCP的,所以其我們先將其當(dāng)作TCP服務(wù)器來(lái)實(shí)現(xiàn)。需要注意的是,HTTP協(xié)議有其專(zhuān)門(mén)的操作端口:80。所以我們?cè)O(shè)計(jì)服務(wù)器時(shí)需要使用這個(gè)端口。

在這里,我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單的HTTP服務(wù)器,當(dāng)客戶端連接到服務(wù)器之后,如果收到的是html請(qǐng)求,則返回一個(gè)我們預(yù)先設(shè)定好的網(wǎng)頁(yè)。正常返回這個(gè)網(wǎng)頁(yè),HTTP的功能就完成了,HTTP服務(wù)器會(huì)主動(dòng)斷開(kāi)與客戶端的連接。

3 、 ** TTP****服務(wù)器實(shí)現(xiàn)**

既然是基于TCP的HTTP服務(wù)器,我們佷顯然依然按照TCP服務(wù)器的結(jié)構(gòu)來(lái)實(shí)現(xiàn)。我們依然將其劃分為三個(gè)部分來(lái)實(shí)現(xiàn)。首先要實(shí)現(xiàn)的是HTTP服務(wù)器的初始化。

1 /* HTTP服務(wù)器初始化配置*/
 2  void Http_Server_Initialization(void)
 3 {
 4   struct tcp_pcb *pcb = NULL;                           
 5  
 6   /* 生成一個(gè)新的TCP控制塊 */
 7   pcb = tcp_new();                                   
 8  
 9   /* 控制塊綁定到本地IP和對(duì)應(yīng)端口 */
10   tcp_bind(pcb, IP_ADDR_ANY, TCP_HTTP_SERVER_PORT);      
11  
12   /* 服務(wù)器進(jìn)入偵聽(tīng)狀態(tài) */
13   pcb = tcp_listen(pcb);                       
14  
15   /* 注冊(cè)服務(wù)器accept回調(diào)函數(shù) */
16   tcp_accept(pcb, HttpServerAccept);  
17                                                                      
18 }

從上面的代碼不難看出,與TCP服務(wù)器的初始化一樣:建立控制塊,為控制塊綁定本地IP和端口,服務(wù)器監(jiān)聽(tīng)控制塊同時(shí)注冊(cè)接收處理回調(diào)函數(shù)。所以接下來(lái)就是實(shí)現(xiàn)接收處理回調(diào)函數(shù)。

1 /* HTTP接收回調(diào)函數(shù),客戶端建立連接后,本函數(shù)被調(diào)用 */
2 static err_t HttpServerAccept(void *arg, struct tcp_pcb *pcb, err_t err)
3 {
4   /*注冊(cè)HTTP服務(wù)器回調(diào)函數(shù)*/
5   tcp_recv(pcb, HttpServerCallback);
6  
7   return ERR_OK;
8 }

客戶端連接成功后就會(huì)調(diào)用接收處理回調(diào)函數(shù)。該函數(shù)為tcp_accept_fn類(lèi)型,注冊(cè)到了監(jiān)聽(tīng)控制塊的accept字段。在這個(gè)函數(shù)中,我們需要注冊(cè)HTTP服務(wù)器處理函數(shù)。其功能就由這個(gè)函數(shù)決定。

1 /* HTTP服務(wù)器信息處理回調(diào)函數(shù) */
 2 static err_t HttpServerCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
 3 {
 4   char *data = NULL;
 5  
 6   if (p != NULL)
 7   {       
 8     /* 更新接收窗口 */
 9     tcp_recved(pcb, p->tot_len);
10     data =  p->payload;
11    
12     /* 如果是http請(qǐng)求,返回html信息,否則無(wú)響應(yīng) */
13     if(p->len >=3 && data[0] == 'G'&& data[1] == 'E'&& data[2] == 'T')
14     {
15       tcp_write(pcb, htmlMessage, sizeof(htmlMessage), 1);
16     }
17     else
18     {
19  
20     }
21     pbuf_free(p);
22     tcp_close(pcb);
23   }
24   else if (err == ERR_OK)
25   {
26     return tcp_close(pcb);
27   }
28   return ERR_OK;
29 }

這個(gè)HTTP服務(wù)器非常簡(jiǎn)單,我們只是實(shí)現(xiàn)了GET方法。也就是說(shuō),收到客戶端的html請(qǐng)求后,我們檢測(cè)其要求,如果是GET方法,我們就返回預(yù)先設(shè)定好的網(wǎng)頁(yè),否則無(wú)返回。然后關(guān)閉這一連接。如果我們想要實(shí)現(xiàn)更復(fù)雜的功能,或者需要支持HTTP協(xié)議的其他方法,只需要擴(kuò)展這個(gè)函數(shù)就可以了。

4 、 結(jié)論

HTTP協(xié)議是一種使用非常廣泛的協(xié)議,其基于TCP基礎(chǔ)上運(yùn)行,所以在我們前面已經(jīng)實(shí)現(xiàn)TCP服務(wù)器及客戶端的情況下,開(kāi)發(fā)HTTP服務(wù)器應(yīng)用就顯得簡(jiǎn)單了。在這一篇我們基于LwIP實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的HTTP服務(wù)器應(yīng)用,我們并對(duì)其進(jìn)行了簡(jiǎn)單的測(cè)試,雖然我們只是實(shí)現(xiàn)了GET方法,但經(jīng)測(cè)試設(shè)計(jì)是正確的。如果需要設(shè)計(jì)其他方法的HTTP應(yīng)用只需在此基礎(chǔ)上添加即可。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9553

    瀏覽量

    86839
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    515

    瀏覽量

    32182
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1393

    瀏覽量

    79994
  • 傳輸協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    79

    瀏覽量

    11622
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    89

    瀏覽量

    27861
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求助,能否實(shí)現(xiàn)PPP撥號(hào)功能+構(gòu)建HTTP服務(wù)器?

    用PPP撥號(hào)上網(wǎng),HTTP服務(wù)器沒(méi)問(wèn)題 3、日志,PPP+HTTP功能,在訪問(wèn)HTTP服務(wù)器會(huì)返回錯(cuò)誤:esp-netif_
    發(fā)表于 06-27 07:38

    嵌入式__LWIP_WEB服務(wù)器

    嵌入式__LWIP_WEB服務(wù)器
    發(fā)表于 08-20 09:53

    如何用LWIP進(jìn)行遠(yuǎn)程服務(wù)器連接

    平臺(tái)F107+LWIP1.4.1情景:設(shè)備通過(guò)TCP去連接遠(yuǎn)程服務(wù)器問(wèn)題:國(guó)內(nèi)的服務(wù)器可以瞬間連接上(秒級(jí)),國(guó)外的服務(wù)器需要很長(zhǎng)時(shí)間才可以連接上(分鐘級(jí))、但是電腦連接很快(秒級(jí))不
    發(fā)表于 07-18 01:37

    請(qǐng)問(wèn)UCOSIII的LWIP socket服務(wù)器要怎么寫(xiě)?

    請(qǐng)問(wèn)哪位大神知道UCOSIII的LWIP socket 服務(wù)器要怎么寫(xiě)?求例程~~~
    發(fā)表于 09-24 04:36

    測(cè)試echo服務(wù)器lwip時(shí)出現(xiàn)問(wèn)題的解決辦法?

    嗨,我想利用sdk測(cè)試echo服務(wù)器lwip,fpga程序并運(yùn)行configration。但是,在控制臺(tái)中,有一些行讓我感到困惑。----- lwIP TCP echo服務(wù)器-----
    發(fā)表于 05-12 07:58

    在BL706上基于LwIP協(xié)議棧實(shí)現(xiàn)一個(gè)HTTP服務(wù)器

    是萬(wàn)維網(wǎng)的數(shù)據(jù)通信的基礎(chǔ)。本 demo 主要是在 BL706 上基于 LwIP 協(xié)議棧,實(shí)現(xiàn)一個(gè) HTTP 服務(wù)器,在 BL706 上部署了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),然后我們可以通過(guò)瀏覽去訪
    發(fā)表于 07-04 18:13

    在NUCLEO-H743ZI板上通過(guò)STM32CubeMX生成的代碼有問(wèn)題求助

    STM32CubeMX 生成的配置中。硬件本身是好的。STM32Cube_FW_H7_V1.1.0 中有一個(gè) LwIP HTTP 服務(wù)器示例,如果我將其上傳到電路板,它就可以正常工作
    發(fā)表于 12-27 08:06

    我如何在LWIP HTTP服務(wù)器的示例中更改電源配置呢?

    我正在使用 LWIP HTTP 服務(wù)器的示例,由 STM here提供。但是,時(shí)鐘配置將電源配置為 PWR_LDO_SUPPLY。但是,我的電路板配置為接受
    發(fā)表于 01-03 08:22

    HTTP服務(wù)器fsdata_custom.c項(xiàng)目問(wèn)題求解

    我正在嘗試創(chuàng)建一個(gè) http 服務(wù)器。我使用 makefsdata.exe 創(chuàng)建 fsdata.c 文件。然后我從項(xiàng)目的編譯中排除這個(gè)文件。但是,該項(xiàng)目在嘗試構(gòu)建項(xiàng)目時(shí)會(huì)拋出
    發(fā)表于 01-11 06:20

    HTTP服務(wù)器使用uIP TCP/ IP堆棧的示例

    EC_ M480_ uIP_ HTTP_Led_V1. 00 顯示 HTTP 服務(wù)器, 網(wǎng)頁(yè)非常簡(jiǎn)單 。 HTTP 客戶端, 例如 IE 或 Chrome , 可以通過(guò)超鏈接連接到
    發(fā)表于 08-22 07:07

    如何正確的理解使用WEB服務(wù)器和應(yīng)用程序服務(wù)器HTTP服務(wù)器

    WEB服務(wù)器、應(yīng)用程序服務(wù)器HTTP服務(wù)器有何區(qū)別?IIS、Apache、Tomcat、Weblogic、WebSphere都各屬于哪種服務(wù)器
    發(fā)表于 05-27 08:00 ?0次下載
    如何正確的理解使用WEB<b class='flag-5'>服務(wù)器</b>和應(yīng)用程序<b class='flag-5'>服務(wù)器</b>及<b class='flag-5'>HTTP</b><b class='flag-5'>服務(wù)器</b>

    【程序】Marvell 88W8801 WiFi模塊連接路由,并使用lwip2.0.3建立http服務(wù)器(20190314版)

    【程序】Marvell 88W8801 WiFi模塊連接路由,并使用lwip2.0.3建立http服務(wù)器(20190314版)
    發(fā)表于 11-21 19:21 ?0次下載
    【程序】Marvell 88W8801 WiFi模塊連接路由<b class='flag-5'>器</b>,并使用<b class='flag-5'>lwip</b>2.0.3建立<b class='flag-5'>http</b><b class='flag-5'>服務(wù)器</b>(20190314版)

    基于LwIP的UDP服務(wù)器設(shè)計(jì)

    我們已經(jīng)實(shí)現(xiàn)了在FreeRTOS系統(tǒng)上的LwIP的移植工作,但只是簡(jiǎn)單的在系統(tǒng)平臺(tái)上跑了起來(lái)。我們還希望能做更多的事情,這一節(jié)我們就在FreeRTOS系統(tǒng)上實(shí)現(xiàn)基于LwIP的UDP服務(wù)器。
    的頭像 發(fā)表于 12-14 15:39 ?1995次閱讀
    基于<b class='flag-5'>LwIP</b>的UDP<b class='flag-5'>服務(wù)器</b>設(shè)計(jì)

    使用NS1串口服務(wù)器HTTP模式上傳服務(wù)器數(shù)據(jù)

    HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)之上。瀏覽作為HTTP客戶端通過(guò)URL向HTTP服務(wù)端即W
    的頭像 發(fā)表于 08-30 12:36 ?694次閱讀
    使用NS1串口<b class='flag-5'>服務(wù)器</b><b class='flag-5'>HTTP</b>模式上傳<b class='flag-5'>服務(wù)器</b>數(shù)據(jù)

    服務(wù)器如何處理 HTTP 請(qǐng)求

    服務(wù)器處理HTTP請(qǐng)求的過(guò)程是一個(gè)有序且復(fù)雜的流程,通常涉及多個(gè)步驟。以下是服務(wù)器處理HTTP請(qǐng)求的具體步驟: 監(jiān)聽(tīng)端口 :HTTP
    的頭像 發(fā)表于 12-30 09:37 ?427次閱讀
    主站蜘蛛池模板: 国产乱码一区二区三区四川人 | 日本一区视频在线观看 | 亚洲看黄 | good韩国理论在线三级 | 精品免费 | 狠狠色影院 | 一级特黄高清完整大片 | 久色中文| 久久综合精品视频 | 午夜免费观看福利片一区二区三区 | 高清一本之道加勒比在线 | 日本三级黄在线观看 | 欧美国产日本高清不卡 | 理论片人人51 | 天天干天天爱天天射 | 三级在线观看网站 | hd性欧美| 日韩高清性爽一级毛片免费 | 午夜手机看片 | 在线电影天堂 | 色偷偷av男人的天堂 | 午夜影院普通 | 免费欧美黄色网址 | 日本黄a | 久久久久九九精品影院 | 九色 在线 | 天天狠天天天天透在线 | 最黄毛片 | 国产在线观看黄 | 日韩免费一级 | 午夜视频在线观看视频 | 中文字幕一区二区三区在线不卡 | 久久婷婷丁香 | 2021国产成人精品国产 | 天堂网www在线资源链接 | 美女扒开尿口给男人看的让 | 国产永久免费爽视频在线 | 伊人不卡久久大香线蕉综合影院 | 免费看片免费播放 | 精品视频一区二区三区 | 日韩中文字幕第一页 |