⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whttp.cpp

📁 WAP2.0协议源码包!!!!!!!!!!!!!!!!!
💻 CPP
字号:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "WHTTP.H"
#include "TCPCLNT.H"
#include "ETR_PPP.H"

/* 分隔符定义 */
#define CRLF		  {0x0d,0x0a,0x0}
#define CR		    {0x0d,0x0}
#define LF			  {0x0a,0x0}
#define CRLFCRLF	{0x0d,0x0a,0x0d,0x0a,0x0}
#define CRCR		  {0x0d,0x0d,0x0}
#define LFLF		  {0x0a,0x0a,0x0}


/* HTTP响应数据单元结构 */
typedef struct _HTTPResponseInfo
{
	unsigned char* StatusLine;  /* 状态行 */
  unsigned char* HeadField;   /* 响应头 */
	unsigned char* EntityField; /* 实体 */

} HTTPResponseInfo;

/**************************************************************
* 模块全局变量定义
*/

/* WAP网关IP地址,默认为10.0.0.172 */
char g_GateWayHost[20] = "10.0.0.172";

/* TCP 客户端 */
TCPClientManager *TcpClient = NULL;

/* 网关 */
struct SERVER_ID *GateWay = NULL;

/* 换行符定义 */
unsigned char CRLF_seperate_flag[3] = CRLF;
unsigned char LF_seperate_flag[2] = LF;
unsigned char CR_seperate_flag[2] = CR;

unsigned char CRLFCRLF_seperate_flag[5] = CRLFCRLF;
unsigned char CRCR_seperate_flag[3] = CRCR;
unsigned char LFLF_seperate_flag[3] = LFLF;


/**************************************************************
* 模块私有函数声明
*/

/* 解析收到的数据 */
static HTTPResponseInfo* GetHttpResponseInfo(unsigned char* Content_Buffer, long len);
static int ReleaseHttpResponseInfo(HTTPResponseInfo* RspInfo);

static int HttpResponseStatusCode(HTTPResponseInfo* RspInfo);
static long HttpResponseContentLength(HTTPResponseInfo* RspInfo);
static unsigned char* HttpResponseContent(HTTPResponseInfo* RspInfo);

/* 发送数据编码 */
static void HTTPGetHeaderFormat(unsigned char *buffer);
static void HTTPPostHeaderFormat(unsigned char *buffer);


/**************************************************************
* 模块公有函数定义
*/

/* 
* HTTP 初始化 
*/
int WHttpOpen( unsigned char *host, int port )
{
    /* 创建网关实例 */
    GateWay = new struct SERVER_ID;
    
    if (GateWay == NULL)
    {
        return 0;
    }
    
    /* 初始化 */
		memset( GateWay->IPStr, 0, 20 );
		GateWay->Port = 0;
    
    if (host != NULL)
	  {
		    strcpy( GateWay->IPStr, (char *)host );
	  }
	  else
	  {
	  	  /* 默认网关10.0.0.172 */
	  	  strcpy( GateWay->IPStr, (char *)g_GateWayHost );
	  }

    if (port != 0)
    {
		    /* 网关端口 */
		    GateWay->Port = port;
    }
    else
    {
    	   /* 网关端口 */
		    GateWay->Port = 80;
    }
    
    /* 创建TCP客户端实例 */
    TcpClient = (TCPClientManager *)new TCPClientManager();
    
    if (TcpClient == NULL)
    {   
    	  delete GateWay;
    	  
    	  GateWay = NULL;
    	  
    	  return 0;
    }
    
     /* 初始化TCP客户端实例 */
    TcpClient->Init( GateWay );
	
	  return 1;
}

/* 
* HTTP 关闭
*/
int WHttpClose()
{
	 if (TcpClient != NULL )
	 {
	 	   delete TcpClient;
	 	   TcpClient = NULL;
	 }
	 
	 if (GateWay != NULL)
	 {
	 	  delete GateWay;
	 	  GateWay = NULL;
	 }
	  
	 return 1;
}

/* 
* HTTP GET 方法调用
*/
int WHttpGetUrl(unsigned char *url)
{
	  char Header[1460];
	  CONN_STATE TcpState = CLOSED;
	  int ret;
	 
    memset(Header, 0, 1460);
	  
	  /* HTTP报头设置为GET方法 */
	  strcpy((char *)Header,"GET ");
    /* strcat((char *)Header,"http://"); */
    strcat((char *)Header, (char *)url);
	  
	  /* HTTP GET 报头编码 */
	  HTTPGetHeaderFormat( (unsigned char*)Header );
	  
	  if ( TcpClient == NULL )
	  {
	  	  return 0;
	  }
	  
	  while( TcpState != OPEN )
	  {
	  	  /* TCP 客户端启动 */
	  	  TcpState = TcpClient->Running();
	  	  
	  	  switch (TcpState)
	  	  {
	  	  case CLOSED:
	  	  	printf("TCP Closed\r\n");
	  	  	return 0;
	  	  
	  	  case START:
	  	  	continue;
	  	  
	  	  case OPEN: /* TCP 连接成功 */
	  	  	printf("TCP Connected\r\n");
	  	  	break;
	  	  
	  	  case FAIL:
	  	  	return 0;
	  	  }
	  }
	  
	  /* TCP 发送数据 HTTP头域 */
	  ret = TcpClient->WriteData(Header, (int)strlen( Header ));
	  
	  if (ret >= 0)
	  {
	  	return 1;
	  }
	  	 
	  return 0;
}

/* 
* HTTP POST 方法调用
*/
int WHttpPost(unsigned char *url, unsigned char *data, long len)
{    
    char Header[1460];
    //char buffer[1460];
    char ContentLength[8];
    //FILE  *fp = NULL;
    CONN_STATE TcpState = CLOSED;
    int ret;
    
    /*if (file_name == NULL || file_len == 0)
	  {
	  	  printf("Can Not Open File\r\n");
	  	  return 0; 
	  }
	  
	  /* 打开数据文件 */
	 /* fp = fopen(file_name, "r+b");
	  
	 // if (fp == NULL)
	 // {
	  	  printf("Can Not Open File\r\n");
	  	  return 0;
	  }*/
	  
	  memset(Header, 0, 1460);
  //  memset(buffer, 0, 1460);
    
    /* HTTP报头设置为POST方法 */
	  strcpy((char *)Header, "POST ");
    
    if (url == NULL)
    {
    	  strcat((char *)Header, "http://mmsc.monternet.com/");
    	  //strcat((char *)Header, "mmsc.monternet.com");	
    }
    else
    {
    	  strcat((char *)Header, url);	
    }
    
    /* POST报头编码 */
	  HTTPPostHeaderFormat((unsigned char *)Header);
    
    if ( TcpClient == NULL )
	  {
	  	 // fclose(fp);
	  	  return 0;
	  }
	  
	  while( TcpState != OPEN )
	  {
	  	  /* TCP 客户端启动 */
	  	  TcpState = TcpClient->Running();
	  	  
	  	  switch (TcpState)
	  	  {
	  	  case CLOSED:
	  	       //	fclose(fp);
	  	  	printf("TCP Closed\r\n");
	  	  	return 0;
	  	  
	  	  case START:
	  	  	continue;
	  	  
	  	  case OPEN: /* TCP 连接成功 */
	  	  	printf("TCP Connected\r\n");
	  	  	break;
	  	  
	  	  case FAIL:
	  	  	return 0;
	  	  }
	  }
	  
	  memset(ContentLength, 0, 8);
    sprintf(ContentLength, "%d", len);
    strcat((char *)Header, "Content-Length: ");
    strcat((char *)Header, ContentLength);
    
    /* Header END */
    strcat((char *)Header,"\r\n\r\n");
    
    /* TCP 发送HTTP Header */
	  ret = TcpClient->WriteData(Header, (int)strlen( Header ));
	  
	  if (ret == EMSGSIZE)
	  {
	      printf("Write Buffer Too Small\r\n");	
	  }
	  
	  if (ret < 0)
	  {
	  	 // fclose(fp);
		    printf("TCP Send Fail\r\n");
	  	  return 0;	
	  }
	  
    //ret = (int)fread(buffer, 1, 1300, fp);
	  
	  while (len/1460 != 0)
	  {
	  	  ret = TcpClient->WriteData(data, 1460);
	  	  
	  	  if (ret == EMSGSIZE)
	      {
	         
	         printf("Write Buffer Too Small\r\n");	
        
        }
	  	  
	  	  if (ret < 0)
	  	  {
	  	    //  fclose(fp);
	  	      printf("TCP Send Fail\r\n");
	  	      return 0;		
	  	  }
	  	  
	  	  len = len - 1460;
	  	  data = data + 1460;
	  	 
	  }
	  
	  ret = TcpClient->WriteData(data, len);
	  	  
	  if (ret == EMSGSIZE)
	  {
	         
	      printf("Write Buffer Too Small\r\n");	
        
    }
	  	  
	  if (ret < 0)
	  {
		 // fclose(fp);
	  	  printf("TCP Send Fail\r\n");
	  	  return 0;		
	  }
	  	  
	 
	  return 1;
	 
}

/* 
* HTTP 响应
*/
int WHttpResponse(int *status, unsigned char *data, long data_len)
{
	  char Buffer[1460];
	  char sta[4]; 
	  char *endptr;
	  int len = 0;
	  int ret = 0;
	 
	  memset(Buffer, 0, 1460);
	  *status = 0;
	  
	  if ( TcpClient == NULL )
	  {
	  	 return 0;
	  }
	  
	  printf("Tcp Start Receive Data\r\n");
	  
	  while (1)
	  {
	  	  /* TCP 读取数据 */
	      ret = TcpClient->ReadData(Buffer, 1460);
	  	
	  	  if (ret == ETIMEDOUT) /* 超时 */
	  	  {
	  	  	  TcpClient->Close();
	  	  	  printf("TCP Recv Timeout\r\n");
	  	  	  break;
	  	  }
	  	  
		    if (ret == EWOULDBLOCK) /* 无数据 */
	  	  {
	  	  	  continue; 
	  	  }
	  	  
	  	  if (ret == 0)/* 对方关闭连接 */
	  	  {
	  	  	  printf("TCP Close\r\n");
	  	  	  TcpClient->Close();
	  	  	  break;
	  	  }
	  	  
	  	  if (ret > 0) /* 收到数据 */
	  	  {
	  	  	  if ((len + ret) <= data_len)
	  	  	  {
	  	  	  	printf("TCP Recv Data: %d\r\n", ret);
	  	  	  	
	  	  	  	/* 复制到缓存 */
	  	  	  	memcpy(data + len, Buffer, ret);
	  	  	  	memset(Buffer, 0, 1460);
	  	  	  	len += ret;
	  	  	  }
	  	  	  continue;
	  	  }
	  }
	  
	  /* 获取状态码 */
	  if (len > 11)
	  {
	  	  sta[0] = data[9];
	      sta[1] = data[10];
	      sta[2] = data[11];
	      sta[3] = '\0';
	      
	      *status = (int)strtol(sta, &endptr, 10);
	  }
	  
	  return len;
	  
}


/**************************************************************
* 模块私有函数声明
*/

/* 
* 发送数据编码 
*/
void HTTPGetHeaderFormat(unsigned char* buffer)
{   
	  strcat((char *)buffer," HTTP/1.1");
    strcat((char *)buffer,"\r\n");

	  strcat((char *)buffer,"Accept: text/vnd.wap.wml, application/vnd.wap.wmlscriptc, \
application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.oma.drm.content, application/vnd.oma.dd+xml, \
application/x-wap-prov.browser-bookmarks, image/vnd.wap.wbmp, image/gif, image/jpg, image/jpeg, image/png, image/bmp, \
image/vnd.ziyitong.drm, image/vnd.ziyitong.vis, image/vnd.ziyitong.zdd,text/html, text/css, audio/mpeg,audio/mid, \
audio/midi, audio/x-mid, audio/x-midi, audio/sp-midi, audio/amr, audio/x-wav, application/vnd.oma.drm.message,  \
text/plain, text/vnd.sun.j2me.app-descriptor, application/java, application/java-archive, application/x-java-archive, \
application/Chaotex-wfd, audio/32kadpcm\r\n");
	
	  strcat((char *)buffer,"Accept-Charset: UTF-8\r\n");
	  strcat((char *)buffer,"Accept-Language: zh-CN, zh\r\n");
	  
	  strcat((char *)buffer,"User-Agent: ");
		strcat((char *)buffer,"SAMSUNG-SGH-E908/NetFront 3.2/WAP2.0 Profile/MIDP-2.0");
		strcat((char *)buffer,"\r\n");
	
	  /* 不支持gzip */
	  /* strcat((char *)buffer,"Accept-Encoding: gzip\r\n"); */
	
	  strcat((char *)buffer,"Connection: close\r\n");

	  strcat((char *)buffer,"Host: ");
	  strcat((char *)buffer,"10.0.0.172\r\n");
	  strcat((char *)buffer,"\r\n");
}

static void HTTPPostHeaderFormat(unsigned char *buffer)
{
	  strcat((char *)buffer," HTTP/1.1");
    strcat((char *)buffer,"\r\n");
    
    strcat((char *)buffer,"Host: ");
	  strcat((char *)buffer,"mmsc.monternet.com\r\n");	
    
    strcat((char*)buffer, "Connection: keep-alive\r\n");
    //strcat((char*)buffer, "Connection: close\r\n");
    strcat((char *)buffer, "Content-Type: application/vnd.wap.mms-message\r\n");
    
    strcat((char *)buffer,"User-Agent: ");
		strcat((char *)buffer,"SAMSUNG-SGH-E908/NetFront 3.2/WAP2.0 Profile/MIDP-2.0");
		strcat((char *)buffer,"\r\n");

	  /*strcat((char *)buffer,"Accept: text/vnd.wap.wml, application/vnd.wap.wmlscriptc, \
    application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.oma.drm.content, application/vnd.oma.dd+xml, \
    application/x-wap-prov.browser-bookmarks, image/vnd.wap.wbmp, image/gif, image/jpg, image/jpeg, image/png, image/bmp, \
    image/vnd.ziyitong.drm, image/vnd.ziyitong.vis, image/vnd.ziyitong.zdd,text/html, text/css, audio/mpeg,audio/mid, \
    audio/midi, audio/x-mid, audio/x-midi, audio/sp-midi, audio/amr, audio/x-wav, application/vnd.oma.drm.message,  \
    text/plain, text/vnd.sun.j2me.app-descriptor, application/java, application/java-archive, application/x-java-archive, \
    application/Chaotex-wfd, audio/32kadpcm\r\n");*/
    
    strcat((char *)buffer,"Accept: application/vnd.wap.mms-message, image/vnd.wap.wbmp, \
image/png, image/jpeg, image/gif, text/x-iMelody, text/x-imelody, application/x-midi, \
audio/midi, audio/mid, audio/x-mid, image/bmp, audio/mp3, audio/x-midi, audio/amr, \
application/vnd.smaf, application/vnd.wap.mms-message\r\n");
	  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -