LWIPアプリケーション開発ノート7:LWIPなしオペレーティングシステムのHTTPサーバ

  簡単なTCPサーバーとクライアントアプリケーションを達成するために、私たちの前では、我々はHTTPハイパーテキスト転送プロトコルことをTCPプロトコルに基づいてアプリケーションプロトコルを実装します

1   HTTP プロトコルの紹介  

  略してハイパーテキスト転送プロトコル(ハイパーテキスト転送プロトコル)、HTTPは、アプリケーション層プロトコルTCPベースで、これまでで最も人気のあるアプリケーション層プロトコルの一つであり、HTTPプロトコルのことが言えるのWorld Wide Webの基礎となるものです。

  HTTPは、クライアントの要求で、サーバーは、サーバーがクライアントにデータを送ることができないことを、アプリケーションのトランスポートプロトコルを認めます。通常の状況下で、要求と応答は、ネットワークが一から一です。そして、この要求と応答は、バックエンドの開発者は、多くの場合、要求と応答を参照してくださいです。

  まず、我々はクライアント側の要求、要求ラインからのHTTP要求パケット、リクエストヘッダ、空白行と要求体組成を見てください。次のようにそのメッセージの形式は次のとおりです。

 

  フィールドリクエストメソッド、URLフィールドおよびHTTPプロトコルバージョンフィールドスペースで区切られた3つのフィールドで構成されて要求ラインについてましょう話、。これは、要求の方法、HTTPプロトコルは、いくつかの要求メソッドGET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECTを有していることを理解すべきです。次のように一般的に使用されるいくつかのファースト:

  • GETの方法手段はURL指定されたリソースを取得するために、この要求は、最も簡単な方法は、最も一般的に使用されています。GETメソッドを使用する場合、要求パラメータおよび対応する値が離れパラメータと記号(「・」)との間で、リソース要求パラメータのURIを分離しする疑問符(「?」)を使用して、URIを追加され、このよう送信パラメータの長さも制限され、プライバシー関連情報は、直接URIにさらされます。例/index.jsp?username=holmofy&pa​​ssword=123123用
  • HEADの方法、 GETと同じ使い方が、身体への応答がない、マルチGETを使用するために何の機会はありません。例えば、ネットワークリソースの大きさを理解するん。ContentLength応答フィールドによって送信されたHEADリクエストをダウンロードする前に、またはローカル・キャッシュ・リソースによって決定された応答のフィールドを更新するかどうかをLASTMODIFIED。
  • POSTの方法は、一般的にサーバが要求を処理し、情報又はデータを送信するために使用される(例えば、フォームまたはアップロードファイルを送信します)。比較的かなり秘密主義圏のPOSTフォームの用途を取得し、URL GET長さの制限があり、POSTを使用する必要がある大きなファイルをアップロードします。
  • OPTIONSの方法は、サーバーを要求するための方法は、他の関数やメソッドは、それがサポートするものを伝えます。OPTIONSメソッドによって、あなたはどのような方法で、特定のサーバのサポート、または方法のどのようなサーバーが使用するいくつかの特別なリソースに対処するために依頼することができます。これは、サーバー上の実際のリソースにアクセスせずにそのクライアントによって、あなたはあなたが検出する方法のリソースを扱うことができる知っている最良の方法であると言うことができます。このオプションは、より多くのクロスドメインのHTTP要求の場合に表示され、ここでマップはどのようなクロスドメインのHTTPリクエストの良い説明となっているクロスドメインリクエストに関する記事です。 

  クライアントのHTTP要求は、サーバーが受信した、クライアントへの応答メッセージを送信します。それでは、私たちは、サーバ側の応答パケットを見てください。空白行と体組成に応じて、最初に応答した応答線からHTTPレスポンスメッセージ。次のようにそのメッセージの形式は次のとおりです。

 

  メッセージに応答して、応答ラインは、最も重要な応答行はHTTPステータスコードである、非常に重要です。HTTPプロトコルステータスコードが3桁を有し、最初の数字は5以下、応答のカテゴリを定義します。

  • 1XX 情報のみ。これは、サーバーの要求が受け入れられている表すが、必要性は、101から100までの範囲で、治療を継続します。
  • 2XX リクエスト成功しました。サーバーはリクエストを正しく処理しました。206から200までの範囲。
  • 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服务器的初始化。

 1 /* HTTP服务器初始化配置*/
 2  void Http_Server_Initialization(void)
 3 {
 4   struct tcp_pcb *pcb = NULL;                           
 5  
 6   /* 生成一个新的TCP控制块 */
 7   pcb = tcp_new();                                   
 8  
 9   /* 控制块绑定到本地IP和对应端口 */
10   tcp_bind(pcb, IP_ADDR_ANY, TCP_HTTP_SERVER_PORT);      
11  
12   /* 服务器进入侦听状态 */
13   pcb = tcp_listen(pcb);                       
14  
15   /* 注册服务器accept回调函数 */
16   tcp_accept(pcb, HttpServerAccept);  
17                                                                      
18 }

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

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

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

 1 /* HTTP服务器信息处理回调函数 */
 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请求,返回html信息,否则无响应 */
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 }

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

4  结论  

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

欢迎关注:

おすすめ

転載: www.cnblogs.com/foxclever/p/12045235.html