好了,废话不说了.教大家如何简单使用HTTP吧,这是一个Win32工程.
/*====================================================================*/
这里只是简单的教大家如何使用INTERNET编程(实现HTTP功能)。在实际应用中,
用户还应该做更多的处理,或者用其他的方式实现,如:MFC的封装类实现(CIn
ternetSession,CHttpConnection,CFtpConnection,CFtpFileFind)等等,当然了
,你也可以用底层的SOCKET实现。呵呵。
/*====================================================================*/
// Compile with: /MT /EHsc
#include <afx.h>
#include <afxwin.h>
#include <afxinet.h>
#include <iostream>
using namespace std;
CWinApp theApp;
int main()
{
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
return -1;// MFC 初始化失败!
}
CString strString = _T("");
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hHttpFile = NULL;
LPCSTR szHttp = "text/*";
BOOL bSuccess = FALSE;
char buffer[1024] = {0};
DWORD dwSize = 0;
//初始化HTTP session
hSession = ::InternetOpen( theApp.m_pszAppName,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if( hSession == NULL )
{
strString.Format( "初始化Internet会话失败!错误原因: %d", GetLastError() );
goto END;
}
//打开一个HTTP连接
hConnect = ::InternetConnect(hSession, "www.google.com",
INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
if( hConnect == NULL )
{
strString.Format( "打开HTTP连接失败!错误原因:%d", GetLastError() );
goto END;
}
//打开一个HTTP请求
hHttpFile = ::HttpOpenRequest( hConnect, "GET",
"", "HTTP/1.1", NULL, &szHttp, INTERNET_FLAG_RELOAD, 0 );
if( hHttpFile == NULL )
{
strString.Format( "打开HTTP请求失败!错误原因: %d", GetLastError() );
goto END;
}
//发出请求 并捕获异常
TRY
{
bSuccess = ::HttpSendRequest( hHttpFile, NULL, 0, NULL, 0 );
}
CATCH( CInternetException,pex )
{
pex->ReportError();
goto END;
}
END_CATCH
if( FALSE == bSuccess )
{
strString.Format( "发出请求失败!错误原因:%d", GetLastError() );
goto END;
}
//得到文件的大小及内容
do
{
InternetReadFile( hHttpFile, (LPVOID)buffer, 1023, &dwSize );
if( dwSize <= 0 ) break;
buffer[dwSize] = 0 ;
strString += buffer;
ZeroMemory( buffer, 1024 );
}while ( TRUE );
END://有时用goto语句会使程序更简洁,当然,不能滥用哦。
// 关闭INTERNET句柄
if( hHttpFile ) ::InternetCloseHandle( hHttpFile );
if( hConnect ) ::InternetCloseHandle( hConnect );
if( hSession ) ::InternetCloseHandle( hSession );
cout << (LPCTSTR)strString << endl;
return 0;
}
理论上,你们拷贝过去可以直接用的.呵呵.
下次,教大家如何实现断点续传和断点下载啊!呵呵