为什么indy的idFTP连上后一list就说connection closed gracefully???[:-(](200分)

  • 主题发起人 主题发起人 YoungSun
  • 开始时间 开始时间
Y

YoungSun

Unregistered / Unconfirmed
GUEST, unregistred user!
我用NMFTP,连接和使用都很容易,但用长了总会出问题,说什么连接已经在使用,我看到
有许多人说NMFTP有很多问题,所以就改用indy,但我用indy(9.03版)的idFTP,设置好
后,list(listbox1.items,'*.*',true),它就说"connection closed gracefully"![:(!]
请问这是什么原因?我的FTP服务器是用IIS5.0,win2k专业版。另外问个问题:IIS中如何为
FTP服务添加帐号?
 
各位大虾帮个忙![:I]
 
用个最简单的例子试了一下,发现只有当没有调用idFTP.Connect的时候直接用List会报这样的错。
即需在List之前加一句if not idFTP.Connected then idFTP.Connect;可以参考Delphi里自带的FTPDemo。
不过感觉这样的错误太“低级”了一些:)所以估计不是这么回事,那就需要你把问题发生的环境详细描述一下,
不然别人试不出来这样的错误也就不好帮你想办法。
 
对了,FTP帐号就是WIN2000自身的用户管理中的帐号,所以直接在“本地用户和组”管理中添加即可。
然后在“Internet 信息服务”管理中的“默认FTP站点”的属性框中可以对帐号做进一步的限定。
 
非常感谢5rain6sky!
第一个问题:我是在窗口上放了2个按钮,第一个去连接,第二个去list,它就报错。
而且我如果不连接直接去list的话,出错是在indy的单元中出现地址错误,而不是
connection closed gracefully.[:(!],真是要命!会不会是indy控件版本的问题,
这个版本好像不是正式版。[?]
我现在改用NMFTP解决上传下载问题,但只是目前的权宜之计。
大虾如果有时间的话再帮我看看,非常感谢!
 
我是用D6自带的Indy 8.0.25做的试验,是没问题的。
又当了一个最新的Indy 9.0.10,发现确实有你说的问题。
似乎出在新版本所增加的TIdIOHandler对象上,每一个TIdTCPConnect在连接的时候会自动
创建一个IOHandler,但连接之前如果用户没有指定则为nil,所以直接调用List会报错。
这一点倒比较好解决,每次调用IdFTP的方法前注意保证Connected为True就行了。
但连接被关闭的错误就比较奇怪了,两套源码看起来也比较费劲,并且是只能用一套调试,
我看了半天只能看出还是那个IOHandler出的事儿,在TIdTCPConnect.ReadFromStack里,
当IOHandlder.Recv取不到数据的时候就会出现连接被关闭的现象,但至于为什么取不到
(返回值为0)我没看明白,因为新旧版本最终都是用同样的代码(TIdSocketHandle.Recv)进行读取的。
不过这个问题如果在IDE之外运行是不会出现的,Indy的源码里也说不必把“connection closed gracefully”
当作一个异常,也就是说这是个Indy的正常现象:)所以不去深究也罢,这个本来就是非稳定版本。

总结:要么在代码里注意异常保护,要么干脆还用D6自带的Indy版本,要么再听听别人的意见。
 
刚才又跟了一下老版本的源码,发现读到0是没问题的,只是二者对它的处理不同。
老版本不抛异常而新版本则要求这样做(调用CheckForDisconnect方法时的参数不同),仅此而已:)
 
5rain6sky大虾:
真是太谢谢你了![:I]
 
我在使用IDFTP时总是出现connection closed gracefully(程序24小时运行,每分种检测服务器的文件情况,通过代理),所以我想可能时控件的问题,想使用动态创建控件也许会好一点。但不知道怎么创建请求帮助!
var
idftp:Tidftp
idftp.creat(??) ??填写窗体也错,填写SELF也错,不知如何处理
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部