TClientSocket控件的问题(怀疑是bug)(300分)

to 轻松虎:
呵呵,你说的那个shutdown效果有一些,但依然不行。到了238次依然出现非法错误。
缓冲不足。
既然你用过WSOCKET做CLIENT端,那么能否给欧一个完善点的SERVER-CLIENT程序?
用WSOCKET做得。关键有错误处理以及能拿过来就测试用。
另外,CLIENT端用WSOCKET做,而SERVER端用TSERVERSOCKET做,没有什么问题吧应该?
呵呵。
若是能用的话欧先给你200分记帐上,呵呵,如何?
谢谢。能否尽快。欧EMAIL:lixiuliang@iipc.zju.edu.cn
 
呵呵,看来还是继续 TClientSocket 快些~~
我刚才那种改法已经可以了,其实主要起作用的是 [red]ClientSocket1.Socket.Close[/red],ShutDown 只是为了保险一点。
造成资源不足的根本原因是你那段测试代码,应该把

procedure TForm1.Timer1Timer(Sender: TObject);
中的
if ClientSocket1.Active=False then...
改成
[red] if (ClientSocket1.Active=False) and (ClientSocket1.Socket.SocketHandle = INVALID_SOCKET) then[/red]
因为 Active = false 时,很可能正处于尝试连接的过程中...这时候没有Close 就 Active := true 会造成
重复分配 socket 资源,Close 以后就会把 Socket.handle 句并清空,即 INVALID_SOCKET(-1).
这里有个有趣的现象,很容易犯想当然的错误:
Active 是个属性,赋值时调用的是方法,比如
ClientSocket1.Active:=True;
执行完这句后,Active 还是 [blue]false[/blue],不会马上等于 [red]True[/red],单步执行可以看到这个有趣的现象
所以说,这不算是 ClientSocket 的 Bug,是使用时要注意的问题。
 
你在procedure TForm1.ClientSocket2Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if ErrorCode=10061 then clientSocket2.active:=FALSE:
end;
 
这根本不是DELPHI的BUG,是使用的对TCLIENTSOCKET控件的了解不足,
TCLIENTSOCKET每ACTIVE一次,就建立一个TSOCKET,而你连接失败的时候
没有释放这个资源所有就造成系统出错,也就是没有处理连接失败的这个错误
一般来说连接失败的错误代码是10061和10060,你对这2个错误处理就OK了












 
TO 张无忌:
老兄,你先看看我的程序和下面兄弟的回答再说化,不要没有看明白就开始RE啊,呵呵。

其实,这也不能说是DELPHI的BUG,因为WIN98下有这个资源没有释放的问题。而WIN2K
没有这个问题。应该是跟WIN98带的SOCKET的DLL有些关系。
SOCKET的ONERROR事件没有处理,这也是太低级的错误了。并且也不值300分。
实在不行偶换SOCKET控件或者换平台了。
TO: 轻松虎:
呵呵,谢谢,偶趁吃饭时间测试一把,看你说的这么有信心。偶是欣喜若狂,呵呵。
测试通过就送分,卡卡
 
我觉得应该是系统释放资源的问题。
 
TO jinchi:
你如果了解了WINSOCK 异步模式,就应该真正理解DELPHI为什么要那么封装,
我说的没有任何问题,一般来说,你自己创建的资源自己释放,不忘记了这个
写程序最基本的原则,其实你说的问题,DFW讨论过了N次,自己不看以前的帖子
就来发帖子,不是什么好习惯!
我在重新说一次,DELPHI封装的那2个控件TServerSocket和TClientSocket没有什么
问题,但是使用不那么简单,要想真正用好,比较困难
不要把自己的很多错误认识说成是DELPHI的BUG,那就太可笑了
 
基本同意楼上所言
>DELPHI封装的那2个控件TServerSocket和TClientSocket没有什么
>问题,但是使用不那么简单,要想真正用好,比较困难
>不要把自己的很多错误认识说成是DELPHI的BUG

的确没什么问题,但难用也是真的.
 
to 张无忌网友,呵呵.
看过你不少的回答,相信是delphi中的高手,而偶是因为项目的原因才用到,的确是
半生不熟那种,而偶说bug问题,是因为偶的测试程序在win2k下没有问题,而win98下
才有的.而偶翻阅了很多书,里面都没有提及这一点,偶知道是资源释放的问题,但
偶以为delphi是调用win98的winsocket api出错了.所以偶说怀疑是bug.可能偶
这个怀疑甚微让你光火,特别是作为热爱delhpi的人,若是因为这点偶道歉.

关于大富翁论坛,一向是偶作程序的好帮手,偶一般是开着delphi,一边开着
大富翁论坛的chm离线浏览的文件,有问题直接查一下大多都能解决.也打算有时间
好好看看整理一下笔记,并且回头写写控件,争取能自己研读vcl源码体系构架.偶
也很反感人自己不测试,不想想,拿过来就问人.而大富翁论坛的积分制相信也是为了
防止这一点,呵呵.
另外,嘿嘿,说句实话,你第一次说得解决方法偶程序理就是那么做的,所以偶说你
没有怎么看清问题.

to:all
另外,各位说封装没有问题,但是难用,那么各人能否把遇到的一些问题以及需要注意
的问题说一下?偶是碰到了这个问题,幸好已经在轻松虎网友的帮助下解决了.
另外,偶再开一个帖子吧,来专门讨论delphi的socket控件的使用需要注意的问题.
这个问题先结束,也希望各位到新的帖子上支持一把,偶那个帖子计划200分(偶分
可不多,呜呜呜).

 
接受答案了.
 
我认为,Socket的问题比较特殊,最好不要使用控件,如果功能不是很复杂还是自己
动手写的好,最多 使用线程来解决耗时。

D自带的空间Buger多多,Tcp连接在使用后,程序退出时,常常不能正常退出。等等
 
后面好好研究ics控件,据说非常好,呵呵
 
to jinchi:
我只所以非常脑火,是因为你根本不看以前的帖子,就跑来“送分”
 
顶部