WinInet(Win32 Internet functions)提供給程序員一套完整的Internet調用函數,它被包含在一個名為Wininet.dll的動態聯接庫里。通過它可以輕松地完成對HTTP,FTP以及Gopher的訪問。比如下載HTML頁面;發送FTP請求從而上傳或下載文件還可瀏覽目錄列表,典型的應用是可以通過匿名登錄獲取文件,還有你更新自己的主頁時上傳文件;Gopher的菜單系統使你可以獲取英特網上的資源。對于這三個協議來說,使用它們的步驟是相同的:建立聯接——向服務器提出請求——關閉聯系。當然你也可以通過MFC(Microsoft Foundation Class)更為簡單地(甚至是傻瓜式地)使用WinInet。因為在MFC中,你可以簡單地像訪問硬盤一樣訪問HTTP、FTP以及Gopher服務器(當然不是指可以亂涂亂畫啦……);你更可以不去理睬WinSock和TCP/IP;當然你完全有可能自己從底層寫起,我想其中一個明顯的原因是你認為MFC不夠快,放心吧同志,這不是寫3D游戲……不過要是你認為它不夠靈活的話,那只有自己寫了,沒什么大不了的;還有就是你可以用現成的類(CHttpFile、CFtpFileFind、CGopherFileFind)控制你的數據,因為這些類把這三個協議抽象到了高層的應用程序編程界面,提供快速并且簡單的方法。所以對于用Visual C++的你來說,你至少有兩種方法來使用WinInet:直接調用Win32 Internet Functions和MFC。下面就分別用這兩種方法通過HTTP下載Web頁面,為了更明朗地說明問題,假設網絡暢通無阻,所以你會看到下面的代碼都沒有錯誤或異常處理。準備好一個單文檔界面的自動生成項目,它的視的基類最好是CEditView,這樣可以直接把獲取的信息顯示出來;添加一個工具欄圖標,在視中相應消息OnGetHttp()。
首先通過直接調用Win32 Internet Functions下載http://www.hust.edu.cn下的缺省頁面,將要用到的下面幾個函數:AfxParseURL(或者它的擴展AfxParseURLEx)、InternetOpen、InternetConnect、HttpOpenRequest、HttpSendRequest、InternetReadFile、InternetCloseHandle。不用多說,你也可以從它們的名字里猜出它們的功能,函數說明請可以參閱MSDN。
void CWinInetTestView::OnGethttp()
{
//使用Win32API獲取頁面
CString strURL = ″http://www.hust.edu.cn″;
HINTERNET hSession;
HINTERNET hConnect = NULL;
HINTERNET hURL = NULL;
try
{
CString strServer,strObject;
INTERNET_PORT nPort;
DWORD dwServiceType;
//分析給定的URL, 取回服務信息
AfxParseURL(strURL,dwServiceType, strServer, strObject, nPort);
//初始化網絡動態聯接庫,通常用戶只需要調用一次InternetOpen,
//但多次調用InternetOpen是允許的,
//比如需要對不同的實例提供不同的代理服務器
hSession=::Internet Open(″WinInet Test″,
INTER-NET_OPEN-TYPE-PRECONFIG,
(LPCTSTR)NULL,
NULL,0);
//聯接服務器
hConnect=::Internet Connect(h Session,strServer,
INTER-NET-INVALID-PORT-NUMBER,
″″, ″″,
INTERNET-SERVICE-HTTP,
0,0) ;
const char *lpszAcceptTypes[2] = {_T(″Accept: text/* \r″), NULL};
//獲得指定的HTTP句柄
hURL = ::HttpOpenRequest(hConnect, ″GET″, strObject,
HTTP_VERSION, NULL, lpszAcceptTypes,INTERNET-FLAG-EXISTING-CONNECT|
INTER-NET-FLAG-NO_AUTO-REDIRECT|
INTERNET-FLAG-DONT-CACHE|
INTERNET-FLAG-RELOAD,0) ;
//向HTTP服務器發送請求
::HttpSendRequest(hURL,NULL,0,0,0);
CString sText;
TCHAR sz[1024];
DWORD dwBytesRead;
BOOL bOkay = TRUE;
//循環接收
while(bOkay)
{
bOkay = ::InternetReadFile(hURL,sz,1023,&dwBytesRead);
if(bOkay && dwBytesRead > 0)
{
sz[dwBytesRead-1] = '\0';
sText = sz;
sText.Replace(_T(″\n″), _T(″\r\n″));
GetEditCtrl().ReplaceSel(sText);
}
else break;
} }
catch(……)
{
}
//關閉相關句柄
::InternetCloseHandle(hURL);
::InternetCloseHandle(hConnect);
::InternetCloseHandle(hSession);
}
下面用MFC完成同樣的工作,可以看得出,需要寫的代碼相對減少了,而且更為簡單,當你寫大程序時,這一點更為明顯。需要用到的幾個類是:CInternetSession、CHttpConnection、CHttpFile。
void CWinInet TestView::OnGethttp()
{
CInternetSession internetSession(″WinInetTest″, 1, PRE-CONFIG-INTERNET-ACCESS);
CHttpConnection* m-pHttpServer;
CHttpFile* m-pHttpFile;
try
{
CString strServer;
CString strObject;
INTERNET_PORT nPort;
DWORD dwServiceType;
AfxParseURL(strURL, dwServiceType, strServer, strObject, nPort);
m_pHttpServer =internetSession.GetHttp Connection(strServer, nPort);
m-pHttpFile=m-pHttpServer→OpenRequest(CHttpConnection::HTTP-VERB_GET,
strObject, NULL, 1, NULL, NULL, INTER-NET-FLAG-EXISTING-CONNECT|INTERNET-FLAG-NO-AUTO-REDIRECT);
m_pHttpFile->AddRequestHeaders(_T(″Accept: text/*\r\n″));
m_pHttpFile->SendRequest();
CString sText;
TCHAR sz[1024];
while (m_pHttpFile->ReadString(sz, 1023))
{
sText = sz;
sText.Replace(_T(″\n″), _T(″\r\n″));
GetEditCtrl().ReplaceSel(sText);
} }
catch(……)
{
}
if (m_pHttpFile != NULL)
delete m_pHttpFile;
if (m_pHttpServer != NULL)
delete m_pHttpServer;
internetSession.Close();
}
需要注意的是,以上兩段代碼都沒有運用多線程技術,當線路不好或頁面很大時,你的程序就像是死了一樣,沒有反應。所以呢,你應當恰當地運用多線程技術,結合相關的狀態回調函數,提供給用戶一個友好的操作界面。當然,別忘了控制錯誤異常,這在網絡編程中顯得尤其重要
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月