利用Win32的网络函数创建一个网络浏览器_第1页
利用Win32的网络函数创建一个网络浏览器_第2页
利用Win32的网络函数创建一个网络浏览器_第3页
利用Win32的网络函数创建一个网络浏览器_第4页
利用Win32的网络函数创建一个网络浏览器_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用Win32的网络函数创建一个网络浏览器介绍不通过网络,你就无法了解我的一个朋友。计算机杂志已经在internet上设置了电子期刊,而本地的报纸也已经把整个段落都放到了网络上。事实上,许多报纸都在联机。每个人都有一个主页,甚至一些无家可归的人都有一个主页。虽然有许多关于网络的消息难免言过其实,但网络正在变成计算机整体的一部分已经是无庸置疑的了。Microsoft已经介绍了MicrosoftWin32网络函数来协助开发者把网络变成他们的应用程序的整体部分。这些新的功能简化了使用FTP(文件传输协议)、和HTTP(超文本传输协议)访问网络。使用Win32网络函数的开发者不需要对TCP/IP或Windows配件。对于一些最普通的操作,开发者不需要知道他们正在使用的某个协议的细节。最终,Win32网络函数将成为Win32应用程序接口的一部分并且与基于Windows的不同的平台一起发布。最初,Win32网络函数将安装在一个叫做WININET.DLL的再分布式动态链接库里。(来自Microsoft网络软件开发工具包,其网址是:/inter/sdle/)。这属于网络开发工具包的一部分。这篇文章说明了如何使用Win32网络函数去创建一个简单的网络浏览器。它没有具体详细的讨论这些功能的细节,但对他们的用法和操作给出了一个演示。请参考网址是/intdev/sdk/docs/wininet的MicrosoftWin32网络函数的主题,可以了解到全部的细节。这篇文章是配合SurfBear样本应用程序而创作的。SurfBear是一个HTML文件。覆盖了这个过程种特定的网络部分,但它没有涉及与这个过程有关的用户接口问题或HTML文件的显示或操作问题。注意:这篇文章是基于WININET.DLL一个相当早的版本。很可能其中的参数名、标识名和函数名发生了改变。但是函数的范围和意图应该还是和这篇文章中描述的是一致的。网络函数最好的探讨Win32网络函数的方法是直接进入代码。下面的代码是样本的代码,为了方便阅读,错误处理部分已经被删除掉了。HINTERNEThNet=::InternetOpen("MSDNSurfBear",PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0);HINTERNEThUrlFile=::InternetOpenUrl(hNet,"",NULL,0,INTERNET_FLAG_RELOAD,0);charbuffer[10*1024];DWORDdwBytesRead=0;BOOLbRead=::InternetReadFile(hUrlFile,buffer,sizeof(buffer),&dwBytesRead);::InternetCloseHandle(hUrlFile);::InternetCloseHandle(hNet);上面列举的代码包括四个网络函数:InternetOpen、InternetOpenOrl、InternetReadFile和InternetCloseHandle。下面我们依次对这些函数进行分析。InternetOpenInternetOpen初始化WININET.DLL。它在其他的Win32网络函数之前被调用。HINTERNEThNet=::InternetOpen(InternetOpenUrl的第一个参数hInternetSession是从InternetOpen返回的句柄。第二个参数lpszUrl是我们需要的资源的URL(统一资源定位)。在上面的例子中,我们想得到一个Microsoft的web主页。下面两个参数lpszHeaders和HeaderLength用来向服务器传送额外的信息。使用这些参数要求具有正在使用的特定协议的知识。DwFlag是一个可以用几种方式修改InternetOpenUrl行为的标志,InternetOpenUrl的行为包括关闭、隐藏,使原始数据可用和用存在的连接取代开辟一个新的连接。最后一个参数dwContext是一个DWORD上下文值。如果有一个值已经被指定,它将被送到状态回调函数。如果这个值是0,信息将不会被送到状态回调函数。InternetReadFile你打开一个文件后,就要读它,所以下一个函数是InternetReadFile是符合逻辑的:charbuffer[10*1024];DWORDdwBytesRead=0;BOOLbRead=::InternetReadFile(hUrlFile,//1HINTERNEThFilebuffer,//2LPVOIDlpBuffersizeof(buffer),//3DWORDdwNumberOfBytesToRead&dwBytesRead//4LPDWORDlpdwNumberOfBytesRead);buffer[dwBytesRead]=0;pEditCtrl->SetWindowText(buffer);InternetReadFile接收InternetOpenUrl返回的句柄。它也对其他Win32网络函数,例如FtpOpenFile,FopherOpenFile和HttpOpenRequest返回的句柄有影响。剩下的InternetReadFile的三个参数也非常的明白直接。Inbuffer是指向保留数据的缓冲区的一个无返回值指针,dwNumberOfByteToRead以字节为单位指定缓冲区的尺寸。最后一个参数,lpdwNumberOfBytesRead是一个指向包含读入缓冲区字节数的变量的指针。如果返回值是TRUE,而且lpdwNumberOfBytesRead指向0,则文件已经读到了文件的末尾。这个行为与Win32Re3adFile的函数的行为是一致的。一个真正的web浏览器将在InternetReadFile上循环,不停地从Internet上读入数据块。为了显示缓冲区,向缓冲区添加一个0并把它送到编辑器控制。这样,InternetOpen、InternetOpenUrl和InternetReadFile一起创建了Internet浏览器的基础。他们使从Internet上读取文件就象从你的本地硬盘驱动器上读取文件一样容易。HTTP函数在一些例子中,InternetOpenUrl太普通了,所以你可能需要其他的Win32网络函数。InternetOpenUrl相当与不同的FTP,GOPHER和HTTP函数的封皮。当使用HTTP时,InternetOpenUrl调用InternetConnect,HttpOpenRequest以及HttpSendRequest,比如说我们想要在下载一个HTML页之前得到它的尺寸以便于我们在缓冲区中为其分配适当的尺寸,HttpQueryInfo将得到web页的大小。警告:不是所有web页都支持得到页尺寸。(例如:和不支持这个功能)另外,TCP/IP能传递的数据也比要求的要少。所以,你的应用程序应该处理着两种情况并且围绕InternetReadFile循环直到结果为TRUE同时*lpdwNumberOfBytesRead为0。使用HttpOpenRequest,HttpSendRequest和HttpQueryInfo去打开文件/msdn/msdninfo的代码显示如下,错误检测已经被删除。//OpenInternetsession.HINTERNEThSession=::InternetOpen("MSDNSurfBear",PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0);//Connectto.HINTERNEThConnect=::InternetConnect(hSession,"",INTERNET_INVALID_PORT_NUMBER,"","",INTERNET_SERVICE_HTTP,0,0);//Requestthefile/MSDN/MSDNINFO/fromtheserver.HINTERNEThHttpFile=::HttpOpenRequest(hConnect,"GET","/MSDN/MSDNINFO/",HTTP_VERSION,NULL,0,INTERNET_FLAG_DONT_CACHE,0);//Sendtherequest.BOOLbSendRequest=::HttpSendRequest(hHttpFile,NULL,0,0,0);//Getthelengthofthefile.charbufQuery[32];DWORDdwLengthBufQuery=sizeof(bufQuery);BOOLbQuery=::HttpQueryInfo(hHttpFile,HTTP_QUERY_CONTENT_LENGTH,bufQuery,&dwLengthBufQuery);//ConvertlengthfromASCIIstringtoaDWORD.DWORDdwFileSize=(DWORD)atol(bufQuery);//Allocateabufferforthefile.char*buffer=newchar[dwFileSize+1];//Readthefileintothebuffer.DWORDdwBytesRead;BOOLbRead=::InternetReadFile(hHttpFile,buffer,dwFileSize+1,&dwBytesRead);//Putazeroontheendofthebuffer.buffer[dwBytesRead]=0;//ClosealloftheInternethandles.::InternetCloseHandle(hHttpFile);::InternetCloseHandle(hConnect);::InternetCloseHandle(hSession);//Displaythefileinaneditcontrol.pEditCtrl->SetWindowText(buffer);InternetConnectInternetConnet函数连接到一个HTTP,FTP或Gopher服务器:HINTERNEThConnect=::InternetConnect(hSession,//1HINTERNEThInternetSession"",//2LPCTSTRlpszServerNameINTERNET_INVALID_PORT_NUMBER,//3INTERNET_PORTnServerPort"",//4LPCTSTRlpszUsername"",//5LPCTSTRlpszPasswordINTERNET_SERVICE_HTTP,//6DWORDdwService0,//7DWORDdwFlagsO//8DWORDdwContext);第六个参数dwService决定服务类型(HTTP,FTP或Gopher)。在上面的例子中,InternetConnect连接到一个HTTP服务器上,因为dwService被设置成INTERNET_SERVICE_HTTP。第二个参数(设置成)提供了服务器的地址。注意,HTTP地址必须为服务器名作语法分析,InternetOpenUrl为我们作语法分析。第一个参数hInternetSession是从InternetOpen返回的句柄。第四个、第五个参数提供一个用户姓名和密码。这七个参数没有控制任何标志影响HTTP操作。最后一个参数为状态回调函数提供前后关系的信息。HttpOpenRequest一旦和服务器的连接已经建立,我们打开了想要的文件。HttpOpenRequest和HttpSenRequest一起工作打开文件。HttpOpenRequest去创建一个请求句柄并且把参数存储在句柄中。HttpOpenRequest把请求参数送到HTTP服务器。HINTERNEThHttpFile=::HttpOpenRequest(hConnect,//1HINTERNEThHttpSession"GET",//2LPCTSTRlpszVerb"/MSDN/MSDNINFO/",//3LPCTSTRlpszObjectNameHTTP_VERSION,//4LPCTSTRlpszVersionNULL,//5LPCTSTRlpszReferer0,//6LPCTSTRFAR*lplpszAcceptTypesINTERNET_FLAG_DONT_CACHE,//7DWORDdwFlags0//8DWORDdwContext);到现在为止,网络函数的许多参数看起来都类似。HttpOpenResult的第一个参数是由InternetConnet返回的HINTERNET。HttpOpenRequest的第七和第八个参数执行与InternetConnect中有相同名字的参数一样的功能。第二个参数(“GET”)指定我们想要得到由第三个参数(“/MSDN/MSDNINFO/”)命名的对象。HTTP版已经传递第四个参数;现在,它肯定是HTTP棗VERSION。因为“GET”是最流行的动词类型,HttpOpenRequest将为这个参数接收一个空指针。第五个参数lpszReferer是一个网点的地址。在这个网点上我们发现了我们现在想要看见的URL(统一资源定位)。换而言之,如果你在上而且单击了跳到的一个连接,第五个参数就是。因为它使你指向了目标URL(统一资源定位)。这个值可以为空。第六个参数执行一个我们的程序接收的文件类型列表。把空值传递给HttpOpenRequest即通知了服务器只有文本文件可以被接收。HttpSendRequest除了传送请求外,HttpSendRequest允许你传送额外的HTTP标题给服务器。关于HTTP标题的信息可以在/.上的最新HTTP上的最新的说明上找到。在这个例子中,HttpSendRequest的所有参数都被传递为缺省值。BOOLbSendRequest=::HttpSendRequest(hHttpFile,//1HINTERNEThHttpRequestNULL,//2LPCTSTRlpszHeaders0,//3DWORDdwHeadersLength0,//4LPVOIDlpOptional0//5DWORDdwOptionalLength);HttpQueryInfo为了得到关于文件的信息,在调用HttpSendRequest后使用HttpQueryInfo函数:BOOLbQuery=::HttpQueryInfo(hHttpFile,//1HINTERNEThHttpRequestHTTP_QUERY_CONTENT_LENGTH,//2DWORDdwInfoLevelbufQuery,//3LPVOIDlpvBuffer&dwLengthBufQuery//4LPDWORDlpdwBufferLength);查询的结构是字符串或lpvBuffer中的字符串列表。HTTP_QUERY_CONTENT_LENGTH查询得到文件的长度。你可以使用HttpQueryInfo查询大范围的信息。要获知详细情形可查阅网点/intdev/sdk/docs/wininet上的MicrosoftWin32网络函数专题。SurfBear样本应用程序SurBear样本应用程序使用Win32网络函数从Internet上得到文件并且在编辑器上显示原始的HTML格式。SurfBear使用HttpOpenRequest和HttpSendRequest取代InternetOpenUrl,纯粹是为了演示的需要。图2SurfBear屏幕SurfBear是一个MFC4.0版本的对话应用程序。它所有与Internet有关的功能都在InternetThread.h和InternetThread.cpp文件中。从interne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论