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——