+ -
当前位置:首页 → 问答吧 → IdHttp 报错socket error # 10054 connection reset by peer,try except也不能捕获此错误

IdHttp 报错socket error # 10054 connection reset by peer,try except也不能捕获此错误

时间:2011-09-29

来源:互联网

[color=#FF0000][/color]这个问题很多人都问过,解决的方法基本都是如下几种:
1、动态创建idhttp,用完后disconnect并free它
2、用 
  try
  except
  end

我的一个程序,要过30秒左右就登录并获取一些数据,用方法一后,不出错的时间延长了2个多小时,能达到7个多小时正常,但最后还是一样会报错。
用try except 能捕获到一些错误,但有少部分错误拦截不到。
特别是 

socket error # 10054
connection reset by peer

这个错误。
因为此错误一出现,程序就没办法再继续了。我要求不能出现出错对话框!
我用的是 Indy 10.5.5,Delphi2010
原来想过用WebBrowser,但它占用资源大,且不利于做多线程。又想过用 WiniNet,但不会管理cookies之类的。我的程序要求一整天都运行的。


恳请各位有经验的朋友指点为谢!

作者: jozosoft   发布时间: 2011-09-29

网络问题,还有可能上一次没有获取完毕

作者: bdmh   发布时间: 2011-09-29

bdmh,你的回答还是没有解决问题呀。
就算是网络问题,我也不想看到那个对话框。

作者: jozosoft   发布时间: 2011-09-29

1 是不是在except... end里做释放的时候又报错了?
2 记得看过一篇文章httpconnection释放后不会立即断开,可能会延时一段时间才断开连接(注:这种情况在少量连接时貌不会出现问题),但是当连接数量增多时,反复创建释放就会出现连接达到上限,创建连接失败的异常.这点仅供参考,因为来源于网络,偶没测试过

作者: funxu   发布时间: 2011-09-29

抱歉更正一下,刚才的错误二仅适用于服务端,看LZ的情况好像是客户端的问题,那么给另一个解决方案,如果对方的服务器可以接受长连接,那么就申请长连接来获取数据,避免出现不断申请释放的问题,而长连接达到一定时间后则将其释放,重新申请另一个长连接,这样不知道是否会好些?

作者: funxu   发布时间: 2011-09-29

刚才上网查了一下,验证了我的一个猜测

常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: 
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉; 
②:客户关掉了浏览器,而服务器还在给客户端发送数据; 
③:浏览器端按了Stop 

可能的话询问一下服务器管理方是否在你客户端报错的时候服务端也出现了意外处理,主要是判断一下是否是服务端由于某些原因,强制关闭了你的连接,例如连接超时,或者某些防火墙机制,把你当成了恶意访问

作者: funxu   发布时间: 2011-09-29

换ics吧

作者: aqtata   发布时间: 2011-09-29