还是获取网页的问题,不过是多线程

09年我在这个问题上折腾了大半年,还因此写了篇博文[这下该不会阻塞了吧 ],最初的是想实现多线程下载网页源码,但经过对HTTP协议的学习,发现只有支持断点继传的网站才用得上多线程下载,因此又把需求放在批量快速下载网页源码上,比如我同时需要访问100个网页,如果用IdHttp就头大了,Idhttp就连访问302页面也会出现异常,调试起来很麻烦。而用自己写的TWinHttp类,recv函数阻塞的问题是能解决了,但如果短时间频繁的获取网页源码,50%以上的访问都会出现connect失败和recv超时,以前很难解决的问题,这次却让我想到了一个较好的解决办法。

首先,对于connect,如果连接失败就进入死循环重复连接,直接连接成功才退出死循环

对于recv,由于recv失败一般都是因为该函数阻塞导致recv线程超时,而如果超时后不进行再处理的话,下载网页就会失败了。所以解决办法是当recv阻塞导致超时后,重新进行connect、send和recv,也就是当recv失败,就进行死循环重复connect、send和recv操作。

解决connect失败和recv失败的问题都用到了死循环,但如果在这两个操作上始终失败呢,怎么样才能退出死循环?我的解决办法是检查本地网络连接是否正常。当然,有必要也可以对目标网站能否访问进行判断,如果目标网站比较稳定,就不需要这个判断了,比如访问百度。

检查本地网络连接是否正常,我用的方法很简单,就是用gethostbyname函数来获取一个域名的IP地址。

使用以上的办法,目前还没发现有什么负作用,只是可能在短时间频繁访问网页时在死循环中耗费的时间比较多。

下面是新TWinHttp类的源码,这个类实现了GET/HEAD/POST这几个应用,如果本地网络连接正常,经测试,基本不会出现访问失败的现象。

posted @ 2011-04-08 05:13  冷寒生  阅读(899)  评论(0编辑  收藏  举报
IT知识库