毕业设计论文浅析代理服务器的测试与实现.doc

上传人:sccc 文档编号:4863639 上传时间:2023-05-20 格式:DOC 页数:22 大小:293.02KB
返回 下载 相关 举报
毕业设计论文浅析代理服务器的测试与实现.doc_第1页
第1页 / 共22页
毕业设计论文浅析代理服务器的测试与实现.doc_第2页
第2页 / 共22页
毕业设计论文浅析代理服务器的测试与实现.doc_第3页
第3页 / 共22页
毕业设计论文浅析代理服务器的测试与实现.doc_第4页
第4页 / 共22页
毕业设计论文浅析代理服务器的测试与实现.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《毕业设计论文浅析代理服务器的测试与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计论文浅析代理服务器的测试与实现.doc(22页珍藏版)》请在三一办公上搜索。

1、 591论文网 www.591LW.com浅析代理服务器的测试与实现摘 要本论文主要描述一个代理服务器测试程序的设计与实现,需要了解代理服务器的工作原理,在Visual C+ 6.0平台上开发一个基于对话框的MFC应用程序,此程序能够在短时间内验证一批具有特定格式的代理,并将他们按照速度快慢的顺序排列,使得用者能很方便的选择快速可用的代理去访问外网资源。在程序的设计之中作者借鉴了成熟代理软件ProxyFox的一些设计理论。为了让习惯操作ProxyFox的用者能够很好的使用SuperProxy,设计了与ProxyFox相似的界面,当然也在一定程度上使界面做得更为简洁、美观。关键词:代理;服务器;

2、测试第 17 页 共 22 页The Design and Implementation of Proxy Server Testing ProgramAbstractThis thesis describes a proxy server testing programs design and realization. It is needed to master the theory of the Proxy server ,and realize it in Visual C + + 6.0 development platform based on an MFC dialog appl

3、ication procedure. This procedure can verify a number of specific format agents in a short time and order them according to the speed. Users can choose the quickest available agents to visit network resources.In the design process the author drawes on the experience of mature software, ProxyFox, to

4、accommodate the operation habits of ProxyFox. ProxyFox is designed with a similar interface, but it is more concise and beautiful. Key words: proxy ; server; test目 录 论文总页数:22页1引言11.1课题背景11.2本课题研究的意义11.3本课题的研究方法22系统设计基础22.1VC+6.0简介22.2MFC概述23SuperProxy简介33.1系统开发环境33.2SuperProxy功能简述34SuperProxy的设计44.1

5、SuperProxy的界面设计54.2SuperProxy功能模块设计阶段54.3SuperProxy流程图75SuperProxy具体编码实现75.1代理资源列表模块实现75.2代理验证模块实现96系统测试18结 论19参考文献191 引言1.1 课题背景代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览

6、器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。它的工作主要在开放系统互联(OSI)模型的对话层。主要的功能有: 1.突破自身IP访问限制,访问国外站点。教育网、169网等网络用户可以通过代理访

7、问国外网站。 2.访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源 的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务。 3.突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试。 4.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界 的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。 5.隐藏真实IP

8、:上网者也可以通过这种方法隐藏自己的IP,免受攻击。1.2 本课题研究的意义在当前情况下,由于内网和网络或者是两个不同网络之间互访都有很大的速度瓶颈,就像校园网去访问电信网就慢的出奇,在这种情况下很多人都会采用代理上网以期得到可观的速度。本课题就是针对这种情况,设计与实现一个代理服务器测试程序,SuperProxy(极速代理)是在Visual C+ 6.0平台上开发的一个基于对话框的MFC应用程序,此程序能够在短时间内验证特定格式的一批代理,并将他们按照速度快慢的顺序排列。使得用者能很方便的选择快速可用的代理去访问外网资源。1.3 本课题的研究方法课题研究的步骤一般分为五个步骤:确定课题拟定课

9、题计划写开题报告进行研究结题。首先根据自己的特点,选择适于自己的知识结构,自己感兴趣的课题。在进行研究的同时,读书,查与此课题相关的资料,并收集相关问题和经验,为撰写论文打好基础。另外同课题教师,经常研究讨论,并归类整理自己遇到的问题,让自己不仅做好设计,并牢牢掌握住需要用到的技术。2 系统设计基础2.1 VC+6.0简介VC+给人的第一感觉便是过于专业化,高深和晦涩。其实也并非如此,在基本掌握了它之后你就会发现,VC+使用起来是很方便的。至于说难,那是有点。 但这并非是VC+的过错,而是Windows,这个庞大无比对用户亲切之至却对程序员不那么友好的家伙。再说,VC+系出自名门,微软的哪样东

10、西不是 先把你服侍得舒舒服服,然后再把你口袋中的钱掏个精光呢?VC+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较 大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视 图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。2.2 MFC概述MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C+环境下编写应用程序的一个框架和

11、引擎,VC+是WinOS下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台)。MFC就是挂在它之上的一个输助软件开发包,MFC作为与VC+血肉相连的部分(注意C+和VC+的区别:C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC+只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Dephi的关系一个道理,Pascal是Dephi的语言基础,,Dephi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在V

12、B开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面对对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言,MFC同BC+集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC+专配的。 MFC是Win API与C+的结合,API,即微软提供的WinOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Win OS下应用程序的开发,使这些被开发出来的应用程序能在WinOS下运行

13、,比如VB,VC+,Java,Dehpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinOS的消息机制和绘图里,遵守WinOS作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Win编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C+封装,这种结合一方面让用户使用微软的专业C+ SDK来进行Win下应用程序的开发变得容易,因为MFC是对API的封装。微软做了大量的工作,隐藏了好多内节程序开发人员在Win下用C+ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结

14、合是以方便为目的的,必定要付出一定代价(这是微软的一向作风)。因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。3 SuperProxy简介3.1 系统开发环境系统软件环境:操作系统:WindowsXP程序语言:C+开发平台:Visual C+ 6.0浏览器:Inertnet Explorer 6.0系统硬件环境:处理器:AMD Sempron 2400+ 1.66GHz内存:256MB3.2 SuperProxy功能简述SuperProxy是围绕着怎样验证代理服务器的可用性来展开设计与实现的,所以很明确的讲整个系统的主要功能为快速准确的验证一批代理,并按照一定的次序对验

15、证结果进行排序,能够很明显的看出代理间的速度差异,另外会提供一些可以给大家带来方便的辅助功能。以下对SuperProxy将要实现的功能做简要的描述:1. 可以从.txt格式的文件导入代理列表,自动从文件中识别出代理,自动过滤掉空白或者无效格式代理。2. 提供对代理列表的多种操作,如删除代理、添加代理、复制代理等。3. 快速准确地验证所有代理,并自动按照速度的快慢排序,另外提供对单个代理和可选代理的验证。4. 可以导出可用,可选代理到.txt文件。5. 可以选定某个代理设置为IE代理。6. 提供一个代理资源列表,方便用户得到代理。其中提供了对代理资源列表的一些相关操作,如添加、删除代理等。7.

16、简单的代理验证设置。代理列表的导入SuperProxy代理列表的操作验证所有的代理导出可用代理到文本文档IE代理的设置提供代理资源列表代理验证的设置图1 SuperProxy功能结构图4 SuperProxy的设计4.1 SuperProxy的界面设计图2ProxyFox主界面图3SuperProxy主界面4.2 SuperProxy功能模块设计阶段4.3 SuperProxy流程图导入代理列表操作代理列表开始验证代理代理验证结束操作代理列表导出可用代理 图4 SuperProxy系统流程图5 SuperProxy具体编码实现5.1 代理资源列表模块实现这里列出这样一个函数,完成代理资源列表的

17、加载。主要实现思想为在程序运行目录下寻找存在代理资源网站的.txt文件wresourse.txt,如果存在则把其中的代理资源加载入代理资源列表m_listProxyWeb中。如果不存在则把默认的站点:代理中国-BOOL CSuperProxyDlg:LoadResourseListFile() /加载资源文件wresourse.txt中内容到资源列表中CStdioFile file;CString sLine,sFileName;sFileName = wresourse.txt;/LPCTSTR lpszFile = (LPCTSTR)sFileName;CString sName, sAd

18、dress, sDescription;INT nFind;if(!file.Open(sFileName, CFile:modeRead) m_listProxyWeb.InsertItem(0,代理中国); m_listProxyWeb.SetItemText(0,1, m_listProxyWeb.SetItemText(0,2,代理中国(ProxyCN.COM);return FALSE;else while(file.ReadString(sLine) /寻找资源的描述信息 nFind = sLine.Find(_T(_); if(nFind = 0) sDescription =

19、sLine.Right(sLine.GetLength() - nFind - 1); sLine = sLine.Left(nFind); / 寻找资源的地址信息 nFind = sLine.Find(_T(-); if(nFind = 0) sAddress = sLine.Right(sLine.GetLength() - nFind - 1); sName = sLine.Left(nFind);m_listProxyWeb.InsertItem(0,sName); m_listProxyWeb.SetItemText(0,1,sAddress); m_listProxyWeb.Set

20、ItemText(0,2,sDescription); return TRUE;5.2 代理验证模块实现主要运用CWinInet类来实现。实现原理为:开启多个线程,让每一个线程通过列表中的代理去连接某个特定网站(如),下载它的页面存与某个字符串中,记录下整个过程的时间,然后在这个字符串中寻找特定字符串(如”My Yahoo!”),存在则说明代理可用,如果不存在或者说在用代理去连接网站的时候出现异常,不能连接或者连接超时则说明不可用,下面按照程序的流程来描述这段代码:1. 判断列表中是否有代理,没有代理则不需要验证。INT nItemCount = m_listProxy.GetItemCoun

21、t();if(nItemCount m_nThreadsCanRun)nRunCount = m_nThreadsCanRun;/ / 创建线程INT i;for(i=0; inRunCount; i+)g_apThreadi = new CProxyVerifyThread;if(g_apThreadi = NULL) / 如果创建失败MessageBox(_T(创建验证线程中发生异常), _T(验证失败);PostVerify();return; / / 设置每个验证线程的参数CString sProxy;CString sDestURL, sVerifyString; for(i=0;

22、iSetNotifyParent(GetSafeHwnd(), MY_WM_VERIFY_NOTIFY,MY_WM_VERIFY_FINISHED,i, m_nNextVerifyItem);m_nNextVerifyItem +; if(g_apThreadi-SetProxy(sProxy) sDestURL=; sVerifyString=My Yahoo!;if(g_apThreadi-CreateThread() m_listProxy.SetItemText(m_nNextVerifyItem-1, LIST_VERIFY_COLUMN, 验证中.);SetTimer(VERIFY

23、_TIMER_ID_START + i, THREAD_TIME_OUT, NULL);m_nThreadRunning +;break;while(m_nNextVerifyItem nItemCount);4. 通过发线程消息的方式开启所有线程。/ 启动所有线程! for(i=0; iPostThreadMessage(MY_WM_VERIFY_START, 0, 0);5. 线程开启后,进入真正的验证代码(封装于独立的CProxyVerifyThread类中),这里主要是对HTTP服务器进行验证,用MFC中的Winnet类来实现。微软提供的Winnet类是一个应用层的网络通信组件,它可以

24、使你的应用程序很容易的实现http、ftp、gopher等协议而不需要你去深入的了解协议本身的规范。建立Intenet会话new CinternetSession()设置会话参数SetOption()生成Internet连接GetHttpConnection()打开连接OpenRequest()发送请求SendRequest()图5 Winnet类工作流程图/ 按照HTTP协议来验证服务器CString sProxy;/ 组装出符合WinInet函数的代理数据sProxy.Format(_T(%s:%s), m_sProxyAddr, m_sProxyPort); DWORDdwTimeSta

25、rtLink,dwTimeEndLink;BOOL bSuccess;CStringsFileDownload, sLine; / 创建Internet连接,测试服务器速度CInternetSession *m_pSession = NULL;m_pSession = new CInternetSession(_T(Mozilla/4.0 (compatible; MSIE 5.00; Windows 98),0,INTERNET_OPEN_TYPE_PROXY,sProxy,NULL,INTERNET_FLAG_DONT_CACHE);if(m_pSession = NULL) nVerif

26、yState = VERIFY_FAILED;return; / 设置超时时间和重试次数m_pSession-SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5000);/ 5秒的连接超时m_pSession-SetOption(INTERNET_OPTION_SEND_TIMEOUT, 1000);/ 1秒的发送超时m_pSession-SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 7000);/ 7秒的接收超时m_pSession-SetOption(INTERNET_OPTION_DATA_SEND_TIMEO

27、UT, 1000);/ 1秒的发送超时m_pSession-SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 7000);/ 7秒的接收超时m_pSession-SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);/ 1次重试/ 生成连接CHttpConnection*m_pHttpConn = NULL;m_pHttpConn = m_pSession-GetHttpConnection(_T();if(m_pHttpConn = NULL) nVerifyState = VERIFY_FAILED;m_p

28、Session-Close();delete m_pSession;m_pSession = NULL;return; CStringstrObject;strObject.Empty();CHttpFile *m_pHttpFile = NULL;m_pHttpFile = m_pHttpConn-OpenRequest(CHttpConnection:HTTP_VERB_GET,strObject,NULL);if(m_pHttpFile = NULL) nVerifyState = VERIFY_FAILED;m_pHttpConn-Close();m_pSession-Close();

29、delete m_pHttpConn;m_pHttpConn = NULL;delete m_pSession;m_pSession = NULL;return; sFileDownload.Empty();/ 开始进行HTTP文件下载dwTimeStartLink = GetTickCount();/ / 记录动作开始时间trybSuccess = m_pHttpFile-SendRequest();/ 真正发出HTTP请求if(bSuccess) / 如果成功打开了文件while (m_pHttpFile-ReadString(sLine) sFileDownload += sLine +

30、 _T(rn);/m_aVerifynDestID.sRecieveString = sFileDownload;else nVerifyState = VERIFY_FAILED;return;catch (CInternetException *e) nVerifyState = VERIFY_PROXY_UNCONNECTABLE;if(m_pHttpFile != NULL)m_pHttpFile-Close();if(m_pHttpConn != NULL)m_pHttpConn-Close();if(m_pSession != NULL)m_pSession-Close();if(

31、m_pHttpFile != NULL)delete m_pHttpFile;m_pHttpFile = NULL;if(m_pHttpConn != NULL)delete m_pHttpConn;m_pHttpConn = NULL;if(m_pSession != NULL)delete m_pSession;m_pSession = NULL;return;dwTimeEndLink = GetTickCount();dbEndTime = (DOUBLE)(dwTimeEndLink - dwTimeStartLink) / 1000.0;if(sFileDownload.Find(

32、My Yahoo!) = 0)nVerifyState = VERIFY_SUCCESS;else nVerifyState = VERIFY_FILE_UNMATCHED;6. 单个线程验证结束后发自定义的结束消息将验证结果写入代理列表,如果验证失败就将代理列表中验证状态设置为不可用,如果验证代理是可用的则把验证花费的时间填写入代理列表中。然后检测代理列表中是否还有代理需要验,如果有的话设置此线程的参数去验证下一个代理,直到代理列表中没有代理需要验证。if(m_hwndParent != NULL) / 如果定义了需要接收消息的窗口SendMessage(m_hwndParent, m_nF

33、inishMessage, (WPARAM)m_nThreadID, (LPARAM)m_nLParam);void CSuperProxyDlg:OnVerifyFinished(WPARAM wParam, LPARAM lParam) /处理验证完成的信息INT nID = (INT)wParam;INT nVerifyItem = (INT)lParam;/INT nThreadsCanRun = 30;ASSERT (nID = 0 & nID m_nThreadsCanRun);if(nID = m_nThreadsCanRun)return;CProxyVerifyThread

34、*p = g_apThreadnID;ASSERT(p);if(p = NULL)return;KillTimer(VERIFY_TIMER_ID_START+nID);m_nThreadRunning -;/ 记录验证的结果到列表中if(p-nVerifyState = VERIFY_SUCCESS) CString sResult; sResult.Format(_T(%.1f), p-dbEndTime); m_listProxy.SetItemText(nVerifyItem, LIST_VERIFY_COLUMN, sResult);m_listProxy.SetItemData(n

35、VerifyItem, (INT)(p-dbEndTime);elsem_listProxy.SetItemText(nVerifyItem, LIST_VERIFY_COLUMN, lose);m_listProxy.SetItemData(nVerifyItem, 100);/ 使用该线程来处理下一个代理服务器的验证CString sProxy;INT nItemCount = m_listProxy.GetItemCount();BOOL bNeedStart = FALSE;if(m_bVerifyAll = TRUE)/ 如果是验证全部代理 do if(m_nNextVerifyIt

36、em = nItemCount) break;sProxy = GetProxyItem(m_nNextVerifyItem, FALSE);g_apThreadnID-SetNotifyParent(GetSafeHwnd(), MY_WM_VERIFY_NOTIFY,MY_WM_VERIFY_FINISHED,nID, m_nNextVerifyItem);if(m_nNextVerifyItem SetProxy(sProxy) / 设置指定的代理成功 m_listProxy.SetItemText(m_nNextVerifyItem-1, LIST_VERIFY_COLUMN, 验证中

37、); m_nThreadRunning +; bNeedStart = TRUE; break;while(m_nNextVerifyItem = nItemCount)break;if(!m_listProxy.GetItemState(m_nNextVerifyItem, LVIS_SELECTED)m_nNextVerifyItem +;continue;sProxy = GetProxyItem(m_nNextVerifyItem, FALSE);g_apThreadnID-SetNotifyParent(GetSafeHwnd(), MY_WM_VERIFY_NOTIFY,MY_WM

38、_VERIFY_FINISHED,nID, m_nNextVerifyItem);if(m_nNextVerifyItem SetProxy(sProxy) / 设置指定的代理成功 m_listProxy.SetItemText(m_nNextVerifyItem-1, LIST_VERIFY_COLUMN, 验证中); m_nThreadRunning +; bNeedStart = TRUE; break;while(m_nNextVerifyItem PostThreadMessage(MY_WM_VERIFY_START, 0, 0);7. 所以验证线程都结束之后,关闭所有线程,调整各

39、个控件状态并对验证结果按照速度快慢进行排序都在PostVerify()中完成。 /验证完则关闭所有线程并调整界面 if(m_nNextVerifyItem = nItemCount & m_nThreadRunning = 0)PostVerify();6 系统测试SuperProxy的整个测试过程包括两个阶段:第一阶段是在各个子模块完成之后做的针对单个模块的单元测试;第二个阶段则是在整个系统构建完毕之后做的系统测试。下面将针对这两个阶段进行描述。1. 单元测试:单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。对于Superproxy来说我用到的最多的就是为了判断某个变量的值,而在合适的地方添加MessageBox(),以突出的显示某个变量的值。这通常比插入断点,来一步步看变量值来得更直接一些。2. 系统测试:在整个系统完成之后,就开始进行系统的测试,确保每一个模块之间能够协同完成系统需要的功能,而不会出现某个模块因为另一个模块影响而不能够正常工作。这里就IE代理的设置这样一个独立的系统进行的黑盒测试描述:1) 代理列表中存在如下的代理数据:图6 代理列表2) 选择其中的一个代理然后,点击选定设为IE代理:弹出对话框:图7 代理设置确定对话框3) 点击确

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号