使用HTTP传输
#include <afxinet.h>
#include <afxsock.h>
//http传输
DWORD HttpTranslate(
int iRequstType, LPCTSTR pstrURL, LPCTSTR strOptions,
CStringA &szReturn)
{
DWORD dwError = 0;
DWORD dwServiceType;
CString strServer;
CString strObject;
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER;
CString strUsername, strPassword;
//解析URL
if(dwError == 0)
{
if(!AfxParseURLEx(pstrURL, dwServiceType, strServer, strObject, nPort,
strUsername, strPassword))
{
dwError = ERROR_INTERNET_INVALID_URL;
ASSERT(FALSE);
}
}
//初始化Socket
if(dwError == 0)
{
if(!AfxSocketInit())
{
dwError = ERROR_INTERNET_TCPIP_NOT_INSTALLED;
ASSERT(FALSE);
}
}
CInternetSession session;
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
//设置超时时间
if(dwError == 0)
{
if(session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10000)
&& session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 10000)
&& session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 20000))
{
}
else
{
dwError = GetLastError(); //ERROR_INTERNET_INVALID_OPTION;
}
}
if(dwError == 0)
{
try
{
pServer = session.GetHttpConnection(strServer, nPort);
pFile = pServer->OpenRequest(iRequstType, strObject);
pFile->AddRequestHeaders(
_T("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")); //UTF-8
pFile->SendRequest(NULL, 0, (LPVOID)strOptions, strOptions? _tcslen(strOptions):0);
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK)
{
CStringA szReadData;
char szBuff[1025];
UINT nRead = 0;
while (nRead = pFile->Read(szBuff, 1024))
{
szBuff[nRead] = 0;
szReadData += szBuff;
}
//UTF8 ---> Unicode
if(!szReadData.IsEmpty())
{
LPCSTR szSrc = (LPCSTR)szReadData;
int iLen = MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, NULL, 0);
LPWSTR pwData = new WCHAR [iLen + 1];
memset(pwData, 0, (iLen+1)*sizeof(WCHAR));
MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, pwData, iLen);
szReturn = pwData;
delete [] pwData;
}
}
}
catch (CInternetException* pEx)
{
//catch errors from WinInet
dwError = pEx->m_dwError;
#ifdef _DEBUG
pEx->ReportError();
#endif
pEx->Delete();
}
}
//结束清理
{
if(pFile)
{
pFile->Close();
delete pFile;
pFile = NULL;
}
if(pServer)
{
pServer->Close();
delete pServer;
pServer = NULL;
}
session.Close();
}
return dwError;
}
//测试在百度上搜索pt100
CStringA szEcho;
HttpTranslate(CHttpConnection::HTTP_VERB_GET,
_T("http://baike.baidu.com/search?word=pt100&type=0&pn=0&rn=10&submit=search"),
NULL,
szEcho);
try
{
LPCTSTR szFileName = _T("E:\\temp\\t.html");
CFile file(szFileName, CFile::modeCreate|CFile::modeWrite);
file.Write((LPCTSTR)szEcho, szEcho.GetLength() * sizeof(TCHAR));
file.Close();
ShellExecute(NULL, _T("open"), szFileName, NULL, NULL, SW_SHOWNORMAL);
}
catch (CFileException* e)
{
e->ReportError();
e->Delete();
}