WinInet API 淺談

來源:互聯網
上載者:User

一、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);
           }

           運行結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.