今天打算找个简单的文件下载模块,以为轻松完成,谁知道找了大半天竟然一点收获也没有,不劳而获果然不太行,只怪自己基础差,不然早就自己写了,无奈下只能继续努力,终于找到一个相关的,文章如下:
网络函数
最好的探讨Win32网络函数的方法是直接进入代码。下面的代码是样本的代码,为了方便阅读,错误处理部分已经被删除掉了。
HINTERNET hNet = ::InternetOpen("MSDN SurfBear",
PRE_CONFIG_INTERNET_ACCESS,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
HINTERNET hUrlFile = ::InternetOpenUrl(hNet,
"http://www.microsoft.com",
NULL,
0,
INTERNET_FLAG_RELOAD,
0) ;
char buffer[10*1024] ;
DWORD dwBytesRead = 0;
BOOL bRead = ::InternetReadFile(hUrlFile,
buffer,
sizeof(buffer),
&dwBytesRead);
::InternetCloseHandle(hUrlFile) ;
::InternetCloseHandle(hNet) ;
上面列举的代码包括四个网络函数:InternetOpen、InternetOpenOrl、InternetReadFile和InternetCloseHandle。下面我们依次对这些函数进行分析。
InternetOpen
InternetOpen初始化WININET.DLL。它在其他的Win32网络函数之前被调用。
HINTERNET hNet = ::InternetOpen(
"MSDN SurfBear", // 1 LPCTSTR lpszCallerName
PRE_CONFIG_INTERNET_ACCESS, // 2 DWORD dwAccessType
"", // 3 LPCTSTR lpszProxyName
INTERNET_INVALID_PORT_NUMBER, // 4 INTERNET_PORT nProxyPort
0 // 5 DWORD dwFlags
) ;
InternetOpen返回一个类型为HINTERNET的句柄。其他的Win32网络函数把这个句柄当作一个参数。现在你不能把一个HINTERNET句柄用在类似于ReadFile之类的其他Win32函数中。但是随着Microsoft Windows和Microsoft Windows NT网络支持的成熟,这一点在将来不是不可能实现的。
当你已经结束使用Wein32网络函数时,你应该调用InternetCloseHandle释放InternetOpen分配的资源。使用Microsoft基础类(MFC)的应用程序将从文件的构造程序里象征性地调用InternetOpen。绝大多数应用程序都将在每一进程里调用InternetOpen。
InternetOpen 的第一个参数lpszCallerName指定正在使用网络函数的应用程序。当HTTP协议使用时,这个名字将变成用户代理。
第二个参数dwAccessType指定访问类型。在上面的例子里,PRE_CONFIG_INTERNET_ACCESS访问类型指示Win32网络函数使用登记信息去发现一个服务器。使用PRE_CONFIG_INTERNET_ACCESS需要正确设定登记信息。这里我耍了一个小花招并让网络开发者替我登记注册。如果你不想欺骗,你需要按图1所示设定登记信息。
在登记注册中,把AccessType设置为1,则意味着“直接入网”,把AccessType 设置为2,意味着“使用网关”。把DisableServiceLocation设置为1,将让它使用一个已经命名的服务器;否则将找到一个使用注册信息和名字决议(RNR)应用程序接口的服务器,它是Windows接口的一部分。
其他的访问类型包括以下几种:
LOCAL_INTERNET_ACCESS只连接到当地Internet网站。例如,如果我使用SurfBear标志,我就只能访问Microsoft整体的Internet网站。
CERN_PROXY_INTERNET_ACCESS使用一个CERN代理去访问web。CERN代理是一个充当网关的web服务器并且能向要使用代理的服务器发送HTTP请求。
GA