与上一篇教程文章“c++通过TCP/IP协议提交POST信息登录到PHPChina中文开发者社区”不同的
是这次我们使用Wininet库来提交POST请求并得到HTTP响应消息而非服务器响应消息!
本步骤就不讲诉抓包和分析协议包的过程了,如果想知道的话可以去看一下我原先写的TCP提交POST请求里有详细的抓包过程 "c++通过TCP/IP协议提交POST信息登录到PHPChina中文开发者社区"
下面是抓到的POST提交详细信息:
POST /member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lq0cN&inajax=1 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://www.phpchina.com/member.php?mod=logging&action=login
Accept-Language: zh-CN
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Host: www.phpchina.com
Content-Length: 141
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CNZZDATA1260206835=395559444-1503368013-%7C1503727136; CNZZDATA1253686164=28344171-1503363672-%7C1503726440; pgv_pvi=2444701901; UM_distinctid=15e0515a0bef1-0b6f2a02ea70a1-38732142-140000-15e0515a0bf10f; Hm_lvt_8c71400238561a42650208f8e318a121=1503324916,1503327293,1503684977,1503685263; NXZu_3812_sid=QP6ZvN; NXZu_3812_saltkey=utUStUHT; NXZu_3812_lastvisit=1503371200; NXZu_3812_lastact=1503729574%09member.php%09logging; NXZu_3812_ulastactivity=574eU5381ctVgy4atPkwJwQh6kBDyVKy%2BtdKJa8hqFkB2HO34i0e; NXZu_3812_lastcheckfeed=1065280%7C1503381375; NXZu_3812_connect_is_bind=0; NXZu_3812_sendmail=1; pgv_info=ssi=s2734813660; Hm_lpvt_8c71400238561a42650208f8e318a121=1503685267
URL:http://www.phpchina.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lq0cN&inajax=1
URL:
http://www.phpchina.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lq0cN&inajax=1
POST数据:formhash=7a908ad2&referer=http%3A%2F%2Fwww.phpchina.com%2F.%2F&username=123321&password=c8837b23ff8aaa8a2dde915473ce0991&questionid=0&answer=
端口:
80
C++代码如下
#include <iostream>
#include <cstdio>
#include <wininet.h>
#define X "\r\n"
#define URL "http://www.phpchina.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LRsS7&inajax=1" //请求地址
#define _COM "www.phpchina.com" //网站地址
#define _COM_URL "/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1" //请求页面
#define PORT 0x50 //端口号80
#define _POST "formhash=7a908ad2&referer=http%3A%2F%2Fwww.phpchina.com%2F&username=17%E5%B2%81boy&password=9d72df73e107457207b7a594b62929d2&questionid=0&answer=" //POST请求数据
using namespace std;
int main()
{
char _HTTP_ARAC[] = "Accept: */*\r\n"\ //原始协议头
"Referer: "\
URL\
X\
"Accept-Language: zh-cn\r\n"\
"Content-Type: application/x-www-form-urlencoded\r\n\r\n";
char _HTTP_POST[] = _POST;
char _HTTP_File[1024] ={0};
cout << "提交HTTP协议头:" << _HTTP_ARAC << endl;
cout << "提交POST数据:" << _POST << endl;
HINTERNET Inte = InternetOpenA ("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)", 1, "" ,"" ,0); //初始化Wininet并创建一个HTTP连接
if(0 == Inte){
InternetCloseHandle(Inte);
cout << "error InternetOpen" << endl;
}
HINTERNET Connect = InternetConnectA (Inte, _COM,PORT, "","" , 3, 0, 0); //请求与网站连接
if(0 == Connect){
InternetCloseHandle(Inte);
InternetCloseHandle(Connect);
cout << "error InternetConnect" << endl;
}
HINTERNET HttpOpen = HttpOpenRequestA (Connect, "POST", _COM_URL, "HTTP/1.1", NULL,NULL,1, 0); //向网站服务器发送请求页面
if(0 == HttpOpen){
InternetCloseHandle(Inte);
InternetCloseHandle(Connect);
InternetCloseHandle(HttpOpen);
cout << "error HttpOpenRequest" << endl;
}
bool bo = HttpSendRequestA(HttpOpen, _HTTP_ARAC, strlen(_HTTP_ARAC), _HTTP_POST, strlen (_HTTP_POST)); //向网站服务器发送请求HTTP协议和POST请求数据
if(bo == false){
InternetCloseHandle(Inte);
InternetCloseHandle(Connect);
InternetCloseHandle(HttpOpen);
cout << "error HttpSendRequest" << endl;
}
DWORD y = 0;
if(!InternetReadFile (HttpOpen, _HTTP_File, 1024, &y)){ //获取HTTP响应消息
InternetCloseHandle(Inte);
InternetCloseHandle(Connect);
InternetCloseHandle(HttpOpen);
cout << "error InternetReadFile" << endl;
}else{
printf("%s",_HTTP_File); //打印得到的响应消息
}
getchar();
return 0;
}
可以看到返回的汉字信息是乱码英文却不是乱码,从返回的HTTP协议头中看到返回的编码格式是“utf-8" 我们计算机处理汉字时使用的编码时GB2312编码格式所以我们要将服务器返回的HTTP响应信息转换成GB2312编码格式,转换库推荐使用iconv库!
下面是转换后的信息:
<?xml version="1.0" encoding="utf-8"?>
<root><![CDATA[登录失败,您还可以尝4次 script type="text/javascript" reload="1">if(typeof errorhandle_=='function') {errorhandle_('登录失败,您还可以尝4次 , {'loginperm':'1'});}</script>]]></root>?p
密码是随便输入的,所以提示的错误信息,如果不会Wininet库没关系后面我将写一篇文章来详细讲解Wininet库接口函数的详细说明资料