一、WinInet API 簡介
WinInet (Win32 Internet Extensions) API是 Windows 提供的編寫 Internet 用戶端程式的專用介面。這些介面提供了對普通 網際網路通訊協定 (IP)的訪問:HTTP、FTP、Gopher。
二、WinInet API 結構圖(部分)
三、主要函數介紹
1. InternetOpen
初始化WinInet。函數原型如下:
HINTERNET InternetOpen(
LPCTSTR lpszAgent, //指定調用 WinINet 函數的應用程式或入口,該入口用作HTTP協議中使用者代理程式項
DWORDdw AccessType, //訪問要求類型
LPCTSTR lpszProxyName, //當lAccessType類型為INTERNET_OPEN_TYPE_PROXY時,指定Proxy 伺服器的名字。
LPCTSTR lpszProxyBypass, //指定一個可選的主機名稱列表或IP地址,列表可包括未知元素。
DWORD dwFlags //標記
);
2. InternetOpenUrl
通過一個完整的HTTP、FTP或Gopher網址開啟一個資源。函數原型如下:
HINTERNET InternetOpenUrl(
HINTERNET hInternet, //當前的 Internet 交談控制代碼。控制代碼必須由前面的 InternetOpen 調用返回
LPCTSTR lpszUrl, //指定讀取的網址。只有以http:, ftp:, gopher:或者 https: 開頭的網址被支援。
LPCTSTR lpszHeaders, //指定發送到HTTP伺服器的頭資訊
DWORD dwHeadersLength, //額外的頭資訊的大小,以TCHAR為單位
DWORD dwFlags, //標記
DWORD_PTR dwContext //指向一個應用程式定義的值,將隨著返回的控制代碼,一起傳遞給回呼函數
);
3. InternetConnect
為指定的網站開啟一個HTTP、FTP或Gopher會話。函數原型如下:
HINTERNET InternetConnect(
HINTERNET hInternet, //當前的 Internet 交談控制代碼。控制代碼必須由前面的 InternetOpen 調用返回
LPCTSTR lpszServerName, //指定一個Internet伺服器的主機名稱
INTERNET_PORT nServerPort, //指定要串連的連接埠號碼
LPCTSTR lpszUsername, //指定登入使用者名稱
LPCTSTR lpszPassword, //指定登入密碼
DWORD dwService, //指定要訪問的服務類型
DWORD dwFlags, //標記
DWORD_PTR dwContext //指向一個應用程式定義的值,將隨著返回的控制代碼,一起傳遞給回呼函數
);
4.HttpOpenRequest
建立一個HTTP請求控制代碼。函數原型如下:
HINTERNET HttpOpenRequest(
HINTERNET hConnect, //InternetConnect返回的HTTP交談控制代碼
LPCTSTR lpszVerb, //指定HTTP訪問方式,如:GET、POST
LPCTSTR lpszObjectName, //指定的HTTP動作的目標對象名稱
LPCTSTR lpszVersion, //指定HTTP版本號碼
LPCTSTR lpszReferer, //指定引用頁
LPCTSTR *lpszAcceptTypes, //指定用戶端接收的媒體類型
DWORD dwFlags, //標記
DWORD_PTR dwContext //指向一個應用程式定義的值,將隨著返回的控制代碼,一起傳遞給回呼函數
);
5. HttpSendRequest
發送指定的HTTP請求到伺服器。函數原型如下:
BOOL HttpSendRequest(
HINTERNET hRequest, //HttpOpenRequest返回的HTTP請求控制代碼
LPCTSTR lpszHeaders, //指定額外的頭資訊
DWORD dwHeadersLength, //額外的頭資訊長度
LPVOID lpOptional, //指定要發送給伺服器的附加資料
DWORD dwOptionalLength //附加資料長度
);
6. InternetReadFile
接收資料。函數原型如下:
BOOL InternetReadFile(
HINTERNET hFile, //由InternetOpenUrl、HttpOpenRequest、FtpOpenFile返回的有效控制代碼
LPVOID lpBuffer, //指定接收資料的緩衝區
DWORD dwNumberOfBytesToRead, //指定要接收的資料長度
LPDWORD lpdwNumberOfBytesRead //實際接收的資料長度
);
四、應用執行個體(HTTP)(Visual C++ 2010編譯運行通過)
1. 直接使用 InternetOpenUrl 函數
DWORD CNetTestDlg::GetHtml(void)
{
HINTERNET hInternet=InternetOpen(_T("NetTest"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(!hInternet)
throw "Failed to initialize network.";
HINTERNET hUrl=InternetOpenUrl(hInternet,_T("http://www.google.com"),NULL,0,INTERNET_FLAG_RELOAD,0);
if(!hUrl)
throw "Failed to open the specified url.";
char szBuffer[16384];
memset(szBuffer,0,16384);
DWORD dwRead=0;
BOOL bSuccess=InternetReadFile(hUrl,szBuffer,16384,&dwRead);
if(!bSuccess)
throw "Failed to receive data.";
int len=MultiByteToWideChar(CP_ACP,0,szBuffer,-1,NULL,0);
wchar_t *pwStr=new wchar_t[len];
MultiByteToWideChar(CP_ACP,0,szBuffer,-1,pwStr,len);
SetDlgItemText(IDC_EDIT_READ,pwStr);
InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);
return dwRead;
}
2. 使用 InternetConnect、HttpOpenRequest和 HttpSendRequest
DWORD CNetTestDlg::GetHtml(void)
{
HINTERNET hInternet=InternetOpen(_T("NetTest"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(!hInternet)
throw "Failed to initialize network.";
HINTERNET hConnection=InternetConnect(hInternet,_T("www.baidu.com"),INTERNET_INVALID_PORT_NUMBER,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
if(!hConnection)
throw "Failed to connect the host.";
HINTERNET hRequest=HttpOpenRequest(hConnection,_T("GET"),_T("index.html"),_T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_RELOAD,0);
if(!hRequest)
throw "Failed to open the request.";
BOOL bSuccess=HttpSendRequest(hRequest,NULL,0,NULL,0);
if(!bSuccess)
throw "Failed to send the request.";
char szBuffer[16384];
memset(szBuffer,0,16384);
DWORD dwRead=0;
BOOL bRead=InternetReadFile(hRequest,szBuffer,16384,&dwRead);
if(!bRead)
throw "Failed to receive date.";
int len=MultiByteToWideChar(CP_ACP,0,szBuffer,-1,NULL,0);
wchar_t *pwstr=new wchar_t[len];
MultiByteToWideChar(CP_ACP,0,szBuffer,-1,pwstr,len);
SetDlgItemText(IDC_EDIT_READ,pwstr);
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnection);
InternetCloseHandle(hInternet);
}
運行結果: