📄 http.c
字号:
//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 + -