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

📄 http.c

📁 HTTP客户端例子程序 用HTTP协议与WEB网站通信
💻 C
📖 第 1 页 / 共 5 页
字号:
//HTTP客户端例子程序
//younkee_support@163.com
//用HTTP协议与WEB网站通信,实现基本的GET/POST消息交互。
//主要功能:
//GET 网站上的页面、下载JPG文件等
//POST 表单,包括上传文件。
//分析部分常用的返回信息
//主要用途:
//实践GET/POST消息交互,根据网站的内容具体修改可以定制成专用的接口程序。
//主要函数都没有用MFC,可以轻松移植到嵌入式系统。
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <winsock.h>

#define SUCCESS 0
#define FAIL -1

#define MaxStrLen 256
#define LongStrLen 256000

//全局变量
int iState;//状态
char buf[LongStrLen],rec[LongStrLen];
int iALen,i_HTMLLen,i_HeadLen,s,i;
//HTTP Request
char s_Method[MaxStrLen];
char s_URI[MaxStrLen];
char s_Version[MaxStrLen];
char s_Referer[MaxStrLen];
char s_Accept[MaxStrLen];
char s_Accept_Language[MaxStrLen];
char s_Content_Type[MaxStrLen];
char s_Accept_Encoding[MaxStrLen];
char s_User_Agent[MaxStrLen];
char s_Host[MaxStrLen];
char s_Content_Length[MaxStrLen];
char s_Connection[MaxStrLen];
char s_Cache_Control[MaxStrLen];
char s_Cookie[MaxStrLen];
char s_HTMLStr[LongStrLen];
//HTML
int s_iLen;
char s_href[8][MaxStrLen];
char s_src[8][MaxStrLen];
char s_action[8][MaxStrLen];
char s_inputname[8][MaxStrLen];
char s_inputtype[8][MaxStrLen];
char s_inputvalue[8][MaxStrLen];
char s_inputid[8][MaxStrLen];
char s_inputsize[8][MaxStrLen];
//HTTP Respone
char r_Respone_Version[MaxStrLen];
char r_Respone_Code[MaxStrLen];
char r_Respone_Mark[MaxStrLen];
char r_Server[MaxStrLen];
char r_Date[MaxStrLen];
char r_Content_Length[MaxStrLen];
char r_Content_Type[MaxStrLen];
char r_Cache_control[MaxStrLen];
char r_Accept_Ranges[MaxStrLen];
char r_Last_Modified[MaxStrLen];
char r_ETag[MaxStrLen];
char r_Expires[MaxStrLen];
char r_Set_Cookie[MaxStrLen];
char r_HTMLStr[LongStrLen];
//状态
char l_Referer[MaxStrLen];
char l_Path[MaxStrLen];
	

//函数
void init_net(char *mk_name);
int send_to_server(char *server_addr,unsigned short portid);
//,
//					char *send_buf,int length,short recvflag,
//					char *recvbuf,int *recvlen);
void printf_view(char *att);
void WriteLog(char *msg);
int Make_HTTPRequest(char* HTTPStr,
											char* l_Method,
											char* l_URI,
											char* l_Version,
											char* l_Referer,
											char* l_Accept,
											char* l_Accept_Language,
											char* l_Content_Type,
											char* l_Accept_Encoding,
											char* l_User_Agent,
											char* l_Host,
											char* l_Content_Length,
											char* l_Connection,
											char* l_Cache_Control,
											char* l_Cookie,
											char* l_HTMLStr,
											int l_HTMLLen);
int Get_HTTPRespone(char* HTTPStr,
										char* l_Respone_Version,
										char* l_Respone_Code,
										char* l_Respone_Mark,
										char* l_Server,
										char* l_Date,
										char* l_Content_Length,
										char* l_Content_Type,
										char* l_Cache_control,
										char* l_Accept_Ranges,
										char* l_Last_Modified,
										char* l_ETag,
										char* l_Expires,
										char* l_Set_Cookie,
										int* i_HeadLen);
int Get_HTMLData(char* HTMLStr,
								 int iLen,
								 char l_href[][MaxStrLen],
								 char l_src[][MaxStrLen],
								 char l_action[][MaxStrLen],
								 char l_inputname[][MaxStrLen],
								 char l_inputtype[][MaxStrLen],
								 char l_inputvalue[][MaxStrLen],
								 char l_inputid[][MaxStrLen],
								 char l_inputsize[][MaxStrLen]);

void main(void)
{
  char server_addr[MaxStrLen];
  unsigned short portid;
  char str[MaxStrLen];

	iState=0;
  init_net("http");
  printf("Input ip:");
  //gets(server_addr);//输入网站IP
	sprintf(server_addr,"192.168.6.33");
	printf("%s\r\n",server_addr);
  printf("Input port:");
  //gets(str);//输入网站服务端口
	sprintf(str,"80");
	printf("%s\r\n",str);
  portid = atoi(str);

	//网站路径
	sprintf(l_Path,"/term/");
	iState=19;//直接去POST //GET index.asp
  send_to_server(server_addr,portid);//处理函数
	
  printf("finished.\n");
}
//组装HTTPRequest消息的函数
//输入:各可能的参数(仅包括常用的),根据具体的GET/POST消息需要进行组合;
//输入参数统一用字符串格式,不出现的参数要添空串如"";
//输入的数据部分可以是任何数据串(如图形文件),但要给出长度参数。
//处理:按预定的顺序组装消息,空参数将不出现,多数参数自成一行,以\r\n结束
//HTTPRequest消息的头部分还有专门的\r\n结束
//输出:第一个参数(地址)作为组装好的数据消息包输出,如果包括了数据,可能不是简单的字符串。
//函数返回整个消息包的长度。
int Make_HTTPRequest(char* HTTPStr,						//输出,组装好的消息包
											char* l_Method,					//输入,GET或POST
											char* l_URI,						//输入,将要进入的URI地址
											char* l_Version,				//输入,HTTP版本,一般用1.1
											char* l_Referer,				//输入,参考地址
											char* l_Accept,					//输入,接受类型
											char* l_Accept_Language,//输入,接受语言
											char* l_Content_Type,		//输入,内容类型
											char* l_Accept_Encoding,//输入,字符编码
											char* l_User_Agent,			//输入,用户代理
											char* l_Host,						//输入,主机地址
											char* l_Content_Length,	//输入,内容长度,不包括HTTPRequest消息的头部分
											char* l_Connection,			//输入,连接
											char* l_Cache_Control,	//输入,Cache控制
											char* l_Cookie,					//输入,Cookie
											char* l_HTMLStr,				//输入,HTML数据(内容)
											int l_HTMLLen)					//输入,内容长度
{
	int i_ALen,i;
	sprintf(HTTPStr,"");
	//GET /term/index.asp HTTP/1.1
	if (0<strlen(l_Method))
	{
		strcat(HTTPStr,l_Method);
		strcat(HTTPStr," ");
	}
	if (0<strlen(l_URI))
	{
		strcat(HTTPStr,l_URI);
		strcat(HTTPStr," ");
	}
	if (0<strlen(l_Version))
	{
		strcat(HTTPStr,l_Version);
		strcat(HTTPStr,"\r\n");
	}
	//Accept: */*
	if (0<strlen(l_Accept))
	{
		strcat(HTTPStr,"Accept: ");
		strcat(HTTPStr,l_Accept);
		strcat(HTTPStr,"\r\n");
	}
	//Referer: http://192.168.6.33/term/index.asp
	if (0<strlen(l_Referer))
	{
		strcat(HTTPStr,"Referer: ");
		strcat(HTTPStr,l_Referer);
		strcat(HTTPStr,"\r\n");
	}
	//Accept-Language: zh-cn
	if (0<strlen(l_Accept_Language))
	{
		strcat(HTTPStr,"Accept-Language: ");
		strcat(HTTPStr,l_Accept_Language);
		strcat(HTTPStr,"\r\n");
	}
	//Content-Type: application/x-www-form-urlencoded
	if (0<strlen(l_Content_Type))
	{
		strcat(HTTPStr,"Content-Type: ");
		strcat(HTTPStr,l_Content_Type);
		strcat(HTTPStr,"\r\n");
	}
	//Accept-Encoding: gzip, deflate
	if (0<strlen(l_Accept_Encoding))
	{
		strcat(HTTPStr,"Accept-Encoding: ");
		strcat(HTTPStr,l_Accept_Encoding);
		strcat(HTTPStr,"\r\n");
	}
	//User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; WPS; QQDownload 1.7; TencentTraveler )
	if (0<strlen(l_User_Agent))
	{
		strcat(HTTPStr,"User-Agent: ");
		strcat(HTTPStr,l_User_Agent);
		strcat(HTTPStr,"\r\n");
	}
	//Host: 192.168.6.33
	if (0<strlen(l_Host))
	{
		strcat(HTTPStr,"Host: ");
		strcat(HTTPStr,l_Host);
		strcat(HTTPStr,"\r\n");
	}
	//Content-Length: 143
	if (0<strlen(l_Content_Length))
	{
		strcat(HTTPStr,"Content-Length: ");
		strcat(HTTPStr,l_Content_Length);
		strcat(HTTPStr,"\r\n");
	}
	//Connection: Keep-Alive
	if (0<strlen(l_Connection))
	{
		strcat(HTTPStr,"Connection: ");
		strcat(HTTPStr,l_Connection);
		strcat(HTTPStr,"\r\n");
	}
	//Cache-Control: no-cache
	if (0<strlen(l_Cache_Control))
	{
		strcat(HTTPStr,"Cache-Control: ");
		strcat(HTTPStr,l_Cache_Control);
		strcat(HTTPStr,"\r\n");
	}
	//Cookie: ASPSESSIONIDQSSRRBCA=MKNFDBKBLKPCBMOLDPDBECLM
	if (0<strlen(l_Cookie))
	{
		strcat(HTTPStr,"Cookie: ");
		strcat(HTTPStr,l_Cookie);
		strcat(HTTPStr,"\r\n");
	}
	strcat(HTTPStr,"\r\n");
	i_ALen=strlen(HTTPStr);
	for(i=0;i<l_HTMLLen;i++)
	{
		*(HTTPStr+i_ALen+i)=*(l_HTMLStr+i);
	}
	i_ALen=i_ALen+i;
	return(i_ALen);

}//int Make_HTTPRequest

//获取HTML数据参数的函数
//输入:HTML数据串和数据长度
//处理:根据关键字符查找,定位分检出部分常用参数;
//处理过程区分大小写,所以,根据具体应用环境可能需要直接修改代码来适应
//输出:部分常用的参数,以字符串形式输出,默认各参数有8组([0~7]),不存在的为空如""
//函数返回整数,一般不用,仅表示最后输入项的序号
int Get_HTMLData(char* HTMLStr,									//输入,需要分析的HTML数据
								 int iLen,											//输入,HTML数据长度
								 char l_href[][MaxStrLen],			//输出,超连接地址
								 char l_src[][MaxStrLen],				//输出,SRC连接地址,常用与图片文件
								 char l_action[][MaxStrLen],		//输出,动作连接地址
								 char l_inputname[][MaxStrLen],	//输出,FORM的输入项名称
								 char l_inputtype[][MaxStrLen],	//输出,FORM的输入项类型
								 char l_inputvalue[][MaxStrLen],//输出,FORM的输入项默认值
								 char l_inputid[][MaxStrLen],		//输出,FORM的输入项ID
								 char l_inputsize[][MaxStrLen]	//输出,FORM的输入项长度
								 )
{
	int i;
	char *HeadBegin,*BodyEnd,*bufBegin,*bufEnd,*inputBegin,*inputEnd;//*HeadEnd,*BodyBegin,
	char bufMark[10];
	//
	HeadBegin=HTMLStr;
	//HeadEnd=strstr(HTMLStr,"</head>");
	//BodyBegin=strstr(HTMLStr,"<body");
	BodyEnd=HTMLStr+iLen;
	//body
	for(i=0;i<8;i++)
	{
		sprintf(l_href[i],"");
		sprintf(l_src[i],"");
		sprintf(l_action[i],"");
		sprintf(l_inputname[i],"");
		sprintf(l_inputtype[i],"");
		sprintf(l_inputvalue[i],"");
		sprintf(l_inputid[i],"");
		sprintf(l_inputsize[i],"");
	};
	//body
	i=0;
	//href
	bufBegin=strstr(HeadBegin,"href=");
	while ((i<8)&(HeadBegin<bufBegin)&(bufBegin<BodyEnd))
	{
		bufBegin=strstr(bufBegin,"href=");
		if(0==bufBegin)
			break;//没有则退出循环
		if((HeadBegin<bufBegin)&(bufBegin<BodyEnd))
		{
			bufBegin=bufBegin+5;//跳过标题href=
			switch(*bufBegin)
			{
			case ' ':
				sprintf(bufMark," ");
				bufBegin++;
				break;
			case '\'':
				sprintf(bufMark,"\'");
				bufBegin++;
				break;
			case '\"':
				sprintf(bufMark,"\"");
				bufBegin++;
				break;
			default:
				sprintf(bufMark,">");
				break;
			}
			bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
			//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
			if(bufBegin<bufEnd)
			{
				strncpy(l_href[i],bufBegin,(bufEnd-bufBegin));
				l_href[i][bufEnd-bufBegin]='\0';
				i++;
			};
		};
	};//do while
	//src
	i=0;
	bufBegin=strstr(HeadBegin,"src=");
	while ((i<8)&(HeadBegin<bufBegin)&(bufBegin<BodyEnd))
	{
		bufBegin=strstr(bufBegin,"src=");
		if(0==bufBegin)
			break;//没有则退出循环
		if((HeadBegin<bufBegin)&(bufBegin<BodyEnd))
		{
			bufBegin=bufBegin+4;//跳过标题src=
			strncpy(bufMark,bufBegin,1);//取'或"
			bufMark[1]='\0';
			bufBegin=bufBegin+1;//跳过'或"
			bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
			//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
			if(bufBegin<bufEnd)
			{
				strncpy(l_src[i],bufBegin,(bufEnd-bufBegin));
				l_src[i][bufEnd-bufBegin]='\0';
				i++;
			};

⌨️ 快捷键说明

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