LwIP应用开发笔记之七:LwIP无操作系统HTTP服务器

前面我们实现了TCP服务器和客户端的简单应用,接下来我们实现一个基于TCP协议的应用协议,那就是HTTP超文本传输协议。

1、HTTP协议简介

超文本传输协议(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。

我们开发过程有一些状态码比较常见,我们对其简单说明如下:

2、  HTTP服务器端的设计  

我们已经对基于RAW API的TCP应用有了了解。我们在实现TCP服务器的实验时就提到过对于更复杂的应用和应用层协议只是在功能上的差别,从实现的结构及流程来说是完全一致的。所以对于实现HTTP服务器需要使用到的函数及整个操作流程我们就不再叙述了。重点说一说不同的地方。

首先HTTP服务器是基于TCP的,所以其我们先将其当作TCP服务器来实现。需要注意的是,HTTP协议有其专门的操作端口:80。所以我们设计服务器时需要使用这个端口。

在这里,我们设计一个简单的HTTP服务器,当客户端连接到服务器之后,如果收到的是html请求,则返回一个我们预先设定好的网页。正常返回这个网页,HTTP的功能就完成了,HTTP服务器会主动断开与客户端的连接。

3、  TTP服务器实现  

既然是基于TCP的HTTP服务器,我们佷显然依然按照TCP服务器的结构来实现。我们依然将其划分为三个部分来实现。首先要实现的是HTTP服务器的初始化。

/* HTTP服务器初始化配置*/

 void Http_Server_Initialization(void)
{
  struct tcp_pcb *pcb = NULL;                           
 
  /* 生成一个新的TCP控制块 */
  pcb = tcp_new();                                   

  /* 控制块绑定到本地IP和对应端口 */
  tcp_bind(pcb, IP_ADDR_ANY, TCP_HTTP_SERVER_PORT);      

  /* 服务器进入侦听状态 */
  pcb = tcp_listen(pcb);                       

  /* 注册服务器accept回调函数 */
  tcp_accept(pcb, HttpServerAccept);  
                                                                     
}

从上面的代码不难看出,与TCP服务器的初始化一样:建立控制块,为控制块绑定本地IP和端口,服务器监听控制块同时注册接收处理回调函数。所以接下来就是实现接收处理回调函数。

/* HTTP接收回调函数,客户端建立连接后,本函数被调用 */
static err_t HttpServerAccept(void *arg, struct tcp_pcb *pcb, err_t err)
{
  /*注册HTTP服务器回调函数*/
  tcp_recv(pcb, HttpServerCallback);
 
  return ERR_OK;
}

客户端连接成功后就会调用接收处理回调函数。该函数为tcp_accept_fn类型,注册到了监听控制块的accept字段。在这个函数中,我们需要注册HTTP服务器处理函数。其功能就由这个函数决定。

/* HTTP服务器信息处理回调函数 */
static err_t HttpServerCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
  char *data = NULL;

  if (p != NULL)
  {       
    /* 更新接收窗口 */
    tcp_recved(pcb, p->tot_len);
    data =  p->payload;
   
    /* 如果是http请求,返回html信息,否则无响应 */
    if(p->len >=3 && data[0] == 'G'&& data[1] == 'E'&& data[2] == 'T')
    {
      tcp_write(pcb, htmlMessage, sizeof(htmlMessage), 1);
    }
    else
    {

    }
    pbuf_free(p);
    tcp_close(pcb);
  }
  else if (err == ERR_OK)
  {
    return tcp_close(pcb);
  }
  return ERR_OK;
}

这个HTTP服务器非常简单,我们只是实现了GET方法。也就是说,收到客户端的html请求后,我们检测其要求,如果是GET方法,我们就返回预先设定好的网页,否则无返回。然后关闭这一连接。如果我们想要实现更复杂的功能,或者需要支持HTTP协议的其他方法,只需要扩展这个函数就可以了。

4、  结论  

       HTTP协议是一种使用非常广泛的协议,其基于TCP基础上运行,所以在我们前面已经实现TCP服务器及客户端的情况下,开发HTTP服务器应用就显得简单了。在这一篇我们基于LwIP实现了一个简单的HTTP服务器应用,我们并对其进行了简单的测试,虽然我们只是实现了GET方法,但经测试设计是正确的。如果需要设计其他方法的HTTP应用只需在此基础上添加即可。

欢迎关注:

### 回答1: lwip http client是一个轻量级的网络协议栈,主要用于实现TCP/IP协议。其中,http client是lwip中的一个模块,它提供了HTTP客户端的功能,可以与服务器进行HTTP协议的通信。 lwip http client模块支持多种HTTP请求方法,例如GET、POST、HEAD等,并提供了丰富的API接口,方便开发者自定义http请求和响应的参数。开发者可以通过lwip http client模块实现网络应用程序,例如浏览器、文件传输下载等。 使用lwip http client模块需要在应用程序中连接服务器lwip http client模块提供了ssl支持,因此可以实现安全的https通信。在通信过程中,lwip http client模块会对请求和响应进行解析,并提供相应的回调函数,以便应用程序对响应结果进行处理。 可以说,lwip http client是一个非常实用的模块,具有较高的可移植性和灵活性,可在嵌入式系统和其他资源受限的设备上使用。在实际的开发过程中,开发者可以利用其优良的性能和丰富的API接口,快速构建出高效、安全的网络应用程序。 ### 回答2: LWIP是一个轻量级的TCP/IP协议栈,涵盖了TCP、UDP、IP、ICMP、ARP、DNS和DHCP等协议。LWIP还提供了HTTP客户端功能,使得用户可以通过发送HTTP请求来与Web服务器进行通信,并获取相应的HTTP响应数据。 LWIPHTTP客户端支持GET、POST和HEAD等HTTP请求方法,同时也支持Cookie、Basic Authentication和TLS等协议,可以满足用户的基本需求。用户可以通过LWIP提供的API接口来发送HTTP请求,并通过回调函数来处理相应的HTTP响应数据。 LWIPHTTP客户端也支持并发请求,即多个HTTP请求可以同时发送和接收响应,提高了通信效率。此外,LWIP还提供了HTTP Keep-Alive功能,可以保持TCP连接的开启状态,使得客户端和服务器之间的数据传输更加高效稳定。 总的来说,LWIPHTTP客户端提供了一种简单可靠的通信方式,方便用户与Web服务器进行数据交互,为嵌入式系统开发提供了良好的支持。 ### 回答3: lwip是嵌入式领域中流行的一个轻量级IP协议栈,它在网络通信中发挥了重要作用。lwip http client则是lwip中提供的一种HTTP客户端功能,可以很方便地通过HTTP协议与Web服务器进行通信,实现信息的获取和上传。 lwip http client的使用非常简单,只需要按照一定的步骤进行配置和调用即可完成HTTP通信操作。首先,需要在lwip的配置文件中选择启用HTTP client功能,并设置HTTP客户端的缓存大小、超时时间等参数,以适应不同的应用场景。接着,需要调用lwip封装好的httpc_request()函数,指定要访问的URL地址、HTTP方法、请求头信息等参数,发送HTTP请求。最后,httpc_request()函数会返回HTTP服务器的响应内容,由应用程序进行解析和处理。 除了基本的HTTP GET和POST请求外,lwip http client还支持SSL/TLS等安全传输协议,可以使用HTTPS协议与服务器进行保密通信,确保敏感信息的安全。同时,lwip http client还支持HTTP chunked编码、gzip压缩等特性,能够在保证效率的前提下,进一步优化HTTP通信的性能。 总之,lwip http client作为一个轻量、简单、可靠的HTTP客户端,为嵌入式设备的网络通信提供了强有力的支持,是嵌入式应用开发中的重要组成部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值