底层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 表示正文段的数据长度,因此你接收报文的时候,就要按照这个格式来接受。 【帮客之家 http://www.bkjia.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的数据,一定要注意数据报文协议。很详细很细节的东西,对接收数据编程有极大的帮助。

相关内容