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

📄 http.c

📁 HTTP客户端例子程序 用HTTP协议与WEB网站通信
💻 C
📖 第 1 页 / 共 5 页
字号:
		};
	};//do while
	//action
	i=0;
	inputBegin=strstr(HeadBegin,"<form");
	if(HeadBegin<inputBegin)//有form才有必要处理下面的input等
	{
		inputEnd=strstr(inputBegin,">");
		bufBegin=strstr(inputBegin," action=");
		while ((i<8)&(inputBegin<bufBegin)&(bufBegin<inputEnd))
		{
			bufBegin=strstr(bufBegin," action=");
			if(0==bufBegin)
				break;//没有则退出循环
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+8;//跳过标题 action=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufBegin<bufEnd)
				{
					strncpy(l_action[i],bufBegin,(bufEnd-bufBegin));
					l_action[i][bufEnd-bufBegin]='\0';
					i++;
				};
			};
		};//do while
		//input
		i=0;
		inputBegin=strstr(HeadBegin,"<input ");
		while ((i<8)&(HeadBegin<inputBegin)&(inputBegin<BodyEnd))
		{
			inputBegin=strstr(inputBegin,"<input ");
			if(0==inputBegin)
				break;//没有则退出循环
			inputEnd=strstr(inputBegin,">");
			inputBegin++;//往后移一点,以免下次还在原地找到。
			//name
			bufBegin=strstr(inputBegin,"name=");
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+5;//跳过标题name=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufEnd != NULL)
				{
					strncpy(l_inputname[i],bufBegin,(bufEnd-bufBegin));
					l_inputname[i][bufEnd-bufBegin]='\0';
				};
			};
			//type
			bufBegin=strstr(inputBegin,"type=");
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+5;//跳过标题name=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufEnd != NULL)
				{
					strncpy(l_inputtype[i],bufBegin,(bufEnd-bufBegin));
					l_inputtype[i][bufEnd-bufBegin]='\0';
				};
			};
			//value
			bufBegin=strstr(inputBegin,"value=");
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+6;//跳过标题name=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufEnd != NULL)
				{
					strncpy(l_inputvalue[i],bufBegin,(bufEnd-bufBegin));
					l_inputvalue[i][bufEnd-bufBegin]='\0';
				};
			};
			//id
			bufBegin=strstr(inputBegin,"id=");
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+3;//跳过标题name=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufEnd != NULL)
				{
					strncpy(l_inputid[i],bufBegin,(bufEnd-bufBegin));
					l_inputid[i][bufEnd-bufBegin]='\0';
				};
			};
			//size
			bufBegin=strstr(inputBegin,"size=");
			if((inputBegin<bufBegin)&(bufBegin<inputEnd))
			{
				bufBegin=bufBegin+5;//跳过标题name=
				sprintf(bufMark," ");//分隔符
				bufEnd=strstr(bufBegin,bufMark);//查匹配的结束字符
				if(bufEnd>inputEnd)
					bufEnd=inputEnd;//最后一个可能是>
				//if((bufBegin<bufEnd)&(bufEnd<BodyEnd))
				if(bufEnd != NULL)
				{
					strncpy(l_inputsize[i],bufBegin,(bufEnd-bufBegin));
					l_inputsize[i][bufEnd-bufBegin]='\0';
				};
			};
			i++;//下一个input
		};//do while
	}//if
	return(i);
}//int Get_HTMLData

//获取HTTPRespone消息的部分参数
//输入:HTTPRespone消息(至少包括完整的头部分)
//处理:根据关键字符查找,定位分检出部分常用参数;
//处理过程区分大小写,所以,根据具体应用环境可能需要直接修改代码来适应
//输出:部分常用的参数,以字符串形式输出,不存在的为空如""
//函数返回整数,表示HTTPRespone消息的头部分长度(可以用来计算数据部分的开始)
int Get_HTTPRespone(char* HTTPStr,					//输入,HTTPRespone消息,(至少包括完整的头部分)
										char* l_Respone_Version,//输出,HTTP版本
										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,	//输出,Cache控制
										char* l_Accept_Ranges,	//输出,接受范围
										char* l_Last_Modified,	//输出,最近编辑时间(一般是文件时间)
										char* l_ETag,						//输出,标签
										char* l_Expires,				//输出,有效期
										char* l_Set_Cookie,			//输出,设置Cookie
										int* i_HeadLen)					//输出,HTTPRespone消息的头部分长度
{
	int i;
	char *HeadBegin,*HeadEnd,*bufBegin,*bufEnd;
	//Head
	sprintf(l_Respone_Version,"");
	sprintf(l_Respone_Code,"");
	sprintf(l_Respone_Mark,"");
	sprintf(l_Server,"");
	sprintf(l_Date,"");
	sprintf(l_Content_Length,"");
	sprintf(l_Content_Type,"");
	sprintf(l_Cache_control,"");
	sprintf(l_Accept_Ranges,"");
	sprintf(l_Last_Modified,"");
	sprintf(l_ETag,"");
	sprintf(l_Expires,"");
	sprintf(l_Set_Cookie,"");
	//
	HeadBegin=strstr(HTTPStr,"HTTP");
	HeadEnd=strstr(HTTPStr,"\r\n\r\n");
	i=*i_HeadLen=HeadEnd+4-HeadBegin;//HTTP头部分长度
	//
	bufBegin=strstr(HTTPStr,"HTTP");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufEnd=strstr(HTTPStr," ");
		if((0<bufEnd)&(bufEnd<HeadEnd))
		{
			strncpy(l_Respone_Version,bufBegin,(bufEnd-bufBegin));
			*(l_Respone_Version+(bufEnd-bufBegin))='\0';
			bufBegin=bufEnd+1;//跳过空格
			bufEnd=strstr(bufBegin," ");
			if((0<bufEnd)&(bufEnd<HeadEnd))
			{
				strncpy(l_Respone_Code,bufBegin,(bufEnd-bufBegin));
				*(l_Respone_Code+(bufEnd-bufBegin))='\0';
				bufBegin=bufEnd+1;//跳过空格
				bufEnd=strstr(bufBegin,"\r\n");
				if((0<bufEnd)&(bufEnd<HeadEnd))
				{
					strncpy(l_Respone_Mark,bufBegin,(bufEnd-bufBegin));
					*(l_Respone_Mark+(bufEnd-bufBegin))='\0';
				};
			};
		};
	};
	//
	bufBegin=strstr(HTTPStr,"Server: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+8;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Server,bufBegin,(bufEnd-bufBegin));
			*(l_Server+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Date: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+6;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Date,bufBegin,(bufEnd-bufBegin));
			*(l_Date+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Content-Length: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+16;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Content_Length,bufBegin,(bufEnd-bufBegin));
			*(l_Content_Length+(bufEnd-bufBegin))='\0';
		}
		//数据体结束位置
		//BodyEnd=HeadEnd+4+atoi(l_Content_Length);
	};
	//
	bufBegin=strstr(HTTPStr,"Content-Type: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+14;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Content_Type,bufBegin,(bufEnd-bufBegin));
			*(l_Content_Type+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Cache-control: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+15;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Cache_control,bufBegin,(bufEnd-bufBegin));
			*(l_Cache_control+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Accept-Ranges: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+15;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Accept_Ranges,bufBegin,(bufEnd-bufBegin));
			*(l_Accept_Ranges+(bufEnd-bufBegin))='\0';	
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Last-Modified: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+15;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Last_Modified,bufBegin,(bufEnd-bufBegin));
			*(l_Last_Modified+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"ETag: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+6;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_ETag,bufBegin,(bufEnd-bufBegin));
			*(l_ETag+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Expires: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+9;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Expires,bufBegin,(bufEnd-bufBegin));
			*(l_Expires+(bufEnd-bufBegin))='\0';
		}
	};
	//
	bufBegin=strstr(HTTPStr,"Set-Cookie: ");
	if((0<bufBegin)&(bufBegin<HeadEnd))
	{
		bufBegin=bufBegin+12;//跳过空格
		bufEnd=strstr(bufBegin,"\r\n");
		if(bufBegin<bufEnd)
		{
			strncpy(l_Set_Cookie,bufBegin,(bufEnd-bufBegin));
			*(l_Set_Cookie+(bufEnd-bufBegin))='\0';
		}
	};
	return(i);
}//int Get_HTTPRespone

//发送和接收函数
//输入:服务器地址和端口
//输出:函数返回成功或失败代码
//处理:函数中用状态迁移的模式来实现特定网站的交互流程,主要包括:
//获取首页、下栽图片文件、登陆、进入具体连接、上传图片和时间等信息
int send_to_server(char *server_addr,unsigned short portid)
//,
//					char *send_buf,int length,short recvflag,
//					char *recvbuf,int *recvlen)
{
	unsigned short port;       /* port client will connect to */
  SOCKADDR_IN server;        /* server address  */
  SOCKET sock;               /* client socket */
	char view_msg[128];

	FILE *hd;
	char *tmp,*bufBegin,*bufEnd;
	short overflag,connflag,sendflag,recvflag,sent,recved;
	int recvlen,rLen;;

	overflag=0;
	connflag=1;
	sent=0;//未发送数据
	recved=0;//未收到数据
	while(0==overflag)
	{
		sendflag=0;//默认不需要发送数据
		recvflag=0;//默认不需要接收数据
		if(1==overflag)//做完了
			break;
		switch(iState)
		{
			case 1://GET /term/index.asp
				//准备GET的参数
				sprintf(s_Method,"GET");
				sprintf(s_URI,"/term/index.asp");
				sprintf(s_Version,"HTTP/1.1");
				sprintf(s_Referer,"");
				sprintf(s_Accept,"*/*");
				sprintf(s_Accept_Language,"zh-cn");
				sprintf(s_Content_Type,"");//GET没有Content-Type内容
				sprintf(s_Accept_Encoding,"gzip, deflate");
				sprintf(s_User_Agent,"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; WPS; TencentTraveler )");
				sprintf(s_Host,server_addr);
				sprintf(s_Connection,"Keep-Alive");
				sprintf(s_Cache_Control,"no-cache");
				sprintf(s_Cookie,"");
				//sprintf(s_Cookie,"ASPSESSIONIDQSSRRBCA=MKNFDBKBLKPCBMOLDPDBECLM");
				//记录Referer
				sprintf(l_Referer,"http://%s%s",s_Host,s_URI);
				//HTML内容
				sprintf(s_HTMLStr,"");//GET没有HTML内容
				i_HTMLLen=0;
				sprintf(s_Content_Length,"");//GET没有Content-Length内容
				//清空部分参数
				for(i=0;i<8;i++)
				{
					sprintf(s_href[i],"");
					sprintf(s_src[i],"");
					sprintf(s_action[i],"");
					sprintf(s_inputname[i],"");

⌨️ 快捷键说明

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