歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

底層socket接收基於http協議數據處理

我負責的工作主要是linux後台的服務器應用程序。負責對各個方面的數據進行處理。

我們終端系統,需要從華為的CRM的系統接收報文,此報文就是基於http協議的數據。而我們終端系統是c/c++的程序,需要對報文按字符來處理。因此,需要對http協議進行很詳細的了解。

apach等服務器已經封裝好了,因此用於java開發的系統就不用理會http協議的格式數據了。

下面我分為發送,接收,處理等方面描述一下http協議。

首先要發送。

發送的數據報文格式,如下

  1. eg:POST /reg.jsp HTTP/ (CRLF)  
  2. Accept:image/gif,image/x-xbit,... (CRLF)  
  3. ...  
  4. HOST:www.guet.edu.cn (CRLF)  
  5. Content-Length:22 (CRLF)  
  6. Connection:Keep-Alive (CRLF)  
  7. Cache-Control:no-cache (CRLF)  
  8. (CRLF) //該CRLF 表示消息報頭已經結束,在此之前為消息報頭   
  9. user=jeffrey&pwd=1234 //此行以下為提交的數據  

以上是一個http報文的格式,因此我們後台系統如果發送數據,就要將數據格式拼接成這樣,對端的web服務器才能認識。

接收報文的格式

  1. HTTP/1.1 200 OK  
  2. ETag: W/"158-1192590101000"  
  3. Last-Modified: Wed, 17 Oct 2007 03:01:41 GMT  
  4. Content-Type: text/html  
  5. Content-Length: 158  
  6. Date: Wed, 17 Oct 2007 03:01:59 GMT  
  7. Server: Apache-Coyote/1.1  

這個格式為正確接收報文的格式。其中
Content-Length: 158 表示正文段的數據長度,因此你接收報文的時候,就要按照這個格式來接受。 【Linux公社 http://www.linuxidc.com 】

還有一種chunked 的形式,表示 數據量過大,對端沒flush一次,就發送一次,因此對端就要不停的無限循環的接收數據。每次接收到的數據都是十六制長度+報文

因此接收數據

  1. for (;;)  
  2.     {  
  3.         tmpRespLine = "";  
  4.           
  5.         if (recvLine(tmpRespLine, timeOut))  
  6.         {         
  7.             ACEX_DEBUG(( _ERROR ACE_TEXT( " to recv len failed:[%s]\n"), tmpRespLine.c_str()));           
  8.             return -1;  
  9.         }  
  10.         ACEX_DEBUG(( _INFO ACE_TEXT( " resp len info:[%s]\n"), tmpRespLine.c_str()));           
  11.           
  12.         if (tmpRespLine.length() == 0)  
  13.         {          
  14.             ACEX_DEBUG(( _ERROR ACE_TEXT( " Msg length body is null\n")));       
  15.             if (recvLine(tmpRespLine, timeOut))  
  16.             {         
  17.                 ACEX_DEBUG(( _ERROR ACE_TEXT( " to recv len failed:[%s]\n"), tmpRespLine.c_str()));           
  18.                 return -1;  
  19.             }  
  20.               
  21.             ACEX_DEBUG(( _INFO ACE_TEXT( " resp len info:[%s]\n"), tmpRespLine.c_str()));           
  22.             if (tmpRespLine.length() == 0)  
  23.             {  
  24.                break;      
  25.             }      
  26.         }  

但是帶有長度,就直接根據Content-Length 的長度直接rec就OK

因此底層的數據接收http的數據,一定要注意數據報文協議。很詳細很細節的東西,對接收數據編程有極大的幫助。

Copyright © Linux教程網 All Rights Reserved