C++ 下载网页!

来源:互联网 发布:动态面板数据举例 编辑:程序博客网 时间:2024/06/06 08:35

         HTTP,FTP,TCP/IP~~~等众多的网络协议,在便于管理和安全的同时,却加深了程序员(非网络专业人士)的负担,要想利用C++下载一个网页,难道要记住如此众多的协议?不用怕,微软的API已经为我们封装了众多的函数,隔离开这众多的协议!使到我们浏览网页就像浏览本地文件一样的方便!我们只需知道要实现什么功能,用到什么函数,便可以驾驭互联网庞大的资源了!(当然,一个出色的程序员不应该忽视这些协议!)

        今天让我们从最基本的网页下载开始:

        头文件:<wininet.h>

        库        :<wininet.lib>

        第一步:打开网络连接:
        函数:HINTERNET  InternetOpen(
                                                                       LPCWSTR lpszAgent,
                                                                       DWORD dwAccessType,
                                                                       LPCWSTR lpszProxyName,
                                                                       LPCWSTR lpszProxyBypass,
                                                                       DWORD dwFlags
                                                                       );

         lpszAgent:行动代号:你可以给这次行动拟个名字,这个目测关系不大!

         dwAccessType:连接方式:

                        1,INTERNET_OPEN_TYPE_PRECONFIG : 先检测看看有没有代理,没有就用IE代理连接;

                        2,INTERNET_OPEN_TYPE_PROXY:  利用后面两个参数指定的代理进行连接;

                        3,INTERNET_OPEN_TYPE_DIRECT:直接进行连接,不用代理。

         lpszProxyName: 代理名字:如果选择了代理,这里要指定代理器的名字 ,否则为NULL。

        lpszProxyBypass:代理地址:如果选择了代理,这里要指定代理的地址,否则为NULL。

        dwFlags:连接属性

                     1,INTERNET_FLAG_ASYNC: 使用异步方式打开连接。

                      2,INTERNET_FLAG_FROM_CACHE: 不进行网络连接,请求的内容在cache中查找,如果找不到返回:ERROR_FILE_NOT_FOUND

                      3,INTERNET_FLAG_OFFLINE: 同 INTERNET_FLAG_FROM_CACHE;

                      4,INTERNET_FLAG_DONT_CACHE:返回的内容不写回cache,

                      5,        0            :表示忽略该选项,一般情况下选0就可以。

        

         第二步:打开URL,准备进行读取!

         函数:HINTERNET InternetOpenUrl(
                                                                            HINTERNET hInternet,
                                                                            LPCTSTR lpszUrl,
                                                                            LPCTSTR lpszHeaders,
                                                                            DWORD dwHeadersLength,
                                                                            DWORD dwFlags,
                                                                            DWORD_PTR dwContext
                                                                           );


       hinternet:InternetOpen返回的句柄。

       lpszUrl  :进行打开的URL地址:注意,要有协议头。

       lpszHeaders:增加的协议头,如果不需要,则NULL。

       lpszHeadersLength:协议头的长度,没有则NULL。

       dwFlags :连接属性:

                     1,INTERNET_FLAG_RELOAD:强行下载。

                     2,~~~~~~请参考MSDN;

       dwContext:异步时要用到,否则:0

       

       第三步:读写文件,实现文件的本地下载。

       函数:BOOL InternetReadFile(                                                                
                                                               HINTERNET hFile,                                                             
                                                               LPVOID lpBuffer,
                                                               DWORD dwNumberOfBytesToRead,
                                                               LPDWORD lpdwNumberOfBytesRead
                                                             );

        hFile:InternetOpenUrl返回的句柄。

        lpBuffer:文件输出流。

        dwNumberOfBytesToRead:读取的字节数。不宜过大,每次应该读取小部分,否则会占用过多的内存。

        ipdwNumberOfBytesRead:实际读到的字节数。如果为0,表示读取完成或失败。

         这里应该用循环读取,直到读取完毕:最后参数为0。

         最后一步:把读到的流输出到文件中,至此完毕!


         如无意外,就已经完毕了,然而,谁也不能保证不会出错。出错的时候,可以借助函数:

         GetLastError()和 InternetGetLastResponseInfo()输出错误信息!


         end——

原创粉丝点击