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