18,356
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <Windows.h>
#include <wininet.h>
#include <iostream>
#include <string>
#pragma comment(lib,"Wininet.lib")
#define __HTTP_ACCEPT_TYPE _T("*/*")
#define __HTTP_ACCEPT _T("Accept: */*")
#define __HTTP_VERB_GET _T("GET")
#define __HTTP_VERB_POST _T("POST")
#define __SIZE_BUFFER 1024
using namespace std;
#ifndef tstring
#ifndef _UNICODE
#define tstring string
#else
#define tstring wstring
#endif
#endif
//解析URL
void ParseURL(tstring strURL,tstring& strProtocol,tstring& strAddress,DWORD &dwPort,tstring& strURI)
{
DWORD dwPosition=0,dwStartPosition=0;
tstring::size_type nUrlSize=strURL.size();
BOOL bFlag=FALSE;
//查找协议,如:http://
while(dwPosition<nUrlSize)
{
if(strURL[dwPosition]==_T(':') && strURL[dwPosition+1]==_T('/') && strURL[dwPosition+2]==_T('/'))
{
break;
}
dwPosition++;
}
if(dwPosition==nUrlSize) //没有协议,如www.linuxsir.org/bbs/printthread.php?t=53761
{
strProtocol=_T("http");
dwPosition=0;
}
else if(strURL[dwPosition+1]==_T('/'))
{ //是一个协议
strProtocol=strURL.substr(0,dwPosition).c_str();
for(tstring::size_type i=0; i < strProtocol.size(); i++)
{
strProtocol[i] = tolower(strProtocol[i]);
}
dwStartPosition=dwPosition+=3;
}
while(nUrlSize>0 && dwPosition<nUrlSize && strURL[dwPosition]!=_T('/'))
++dwPosition;
DWORD dwFind=dwStartPosition;
for(;dwFind<=dwPosition;dwFind++){
if(strURL[dwFind]==_T(':'))
{ // find PORT
bFlag=TRUE;
break;
}
}
if(bFlag)
{
tstring strTmp=strURL.substr(dwFind+1,dwPosition-dwFind);
dwPort=_ttol(strTmp.c_str()); //端口
strAddress=strURL.substr(dwStartPosition,dwFind-dwStartPosition); //地址(域名)
}
else if(strProtocol==_T("https"))
{
dwPort=INTERNET_DEFAULT_HTTPS_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}
else
{
dwPort=INTERNET_DEFAULT_HTTP_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}
if(dwPosition<nUrlSize) strURI=strURL.substr(dwPosition,nUrlSize-dwPosition);
else strURI=_T("");
}
int _tmain(int argc, _TCHAR* argv[])
{
tstring strAgent=_T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
tstring strURL=_T("http://www.baidu.com/index.php");
tstring strProtocol,strAddress,strURI;
DWORD dwPort;
ParseURL(strURL,strProtocol,strAddress,dwPort,strURI);
HINTERNET _hHttpSession=::InternetOpen(strAgent.c_str(),INTERNET_OPEN_TYPE_PRECONFIG,_T(""),_T(""),0);
HINTERNET _hHttpConnection=::InternetConnect(_hHttpSession,
strAddress.c_str(),
dwPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
0);
if(::InternetAttemptConnect(NULL)!=ERROR_SUCCESS) return 0;
CONST TCHAR *szAcceptType=_T("*/*");
//就是下面这句出现问题,错误就是弹出一对话框,信息如下:
//ConsoleTest.exe 中的 0x7c84b57b 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突
//我检查了N遍,上面的代码都没错,连接也成功了,但就是HttpOpenRequest不成功 HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
&szAcceptType,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);
return 0;
}
HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
//&szAcceptType,
// (LPCWSTR*)szAcceptType,
(LPCWSTR*) "*/*\0",
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);