線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2691
推到 Plurk!
推到 Facebook!

关于IdTcpClient的ReadLn控件是否有BUG

尚未結案
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-02 13:29:29 IP:202.102.xxx.xxx 未訂閱
我使用线程或TIMER循环读取ReadLn格式如下: 包含在线程或TIMER中 STRCMD:=MyidTcpClient.ReadLn(''); 工作很正常,服务器发送来的消息也能够正常接收到,但就 这个程序在运行10~15分钟后就会出现一个非法操作,大意 是IDTCPCLIENT非法操作,不知道循环读取ReadLn是否会占用 什么系统资源,或者IDTCPCLIENT是否有什么缓冲区,不然为 什么短时间没有任何问题,时间长了就出现问题了。 该问题困扰了我好长的时间,因为整个程序全部完成,工作很 正常,就是客户端开的时间长了TCPCLIENT就会报错。请有识之 士能够指点迷经,不胜感激!
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-02 13:34:11 IP:202.102.xxx.xxx 未訂閱
忘了说一下,那个非法操作一定是这个触发的,因为为了发现问题的所在 我把其它的都屏蔽了,只留了个连接部分和这个。谢谢!
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-03 16:38:35 IP:218.2.xxx.xxx 未訂閱
有没有人可以解答一下啊,就算不能解决大家讨论一下也是好的啊。。。
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-08 17:15:54 IP:211.96.xxx.xxx 未訂閱
我才被这个问题给弄死掉一阵子。。。。 大概的原因有两个,一个是idTCPServer会将闲置过久的连线给中断,那client端就会发生Disconnect by Peer的问题...解决的方法就是Client端放个Timer,固定10秒钟发送一个持续连线的信息给Server端,服务器受到信息也用不着处理,只要让idTCPServer认为连接仍在活动就好,这样就不会有事了,我测试过,如果不用这种手段,Server大约10分钟就会idle Disconnect处理,如果用了这方法,连线七天七夜也不会断线。    还有,idTCPClient的Readln并不会检查TCPIP的Buffer缓存里是不是有内容,如果Server端没发信息,而Client端还Readln的话,便会出现AccessViolation的问题,我的解决方法
procedure timer.ontimer.................
var temp:string;
begin
   idtcpclient.readfromstack(false,1,false);
   while idtcpclient.InputBuffer.Size>0 do begin
      temp:=idtcpclient.ReadLn;        
   end;
end;
这样便不会报错。。。。。。 藏私の禁止
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-08 17:23:03 IP:211.96.xxx.xxx 未訂閱
其实在KTOP很早以前有人提过这个IDTCPClient的Readln的Bug问题,后来有人提出直接修改idTCPConnection.pas的代码来解决问题,但具体什么解决方法却没有让大家分享,害得我还是死在胡同里。。。。我还在期望indy出新版之后能改掉这个问题。。。。等不及了,我就动手改了。。。但,不是改源代码,而是加个判断的方法解决,现在。。。。我写的IM跑的好好的呢。。。。 藏私の禁止
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-10 13:14:48 IP:218.2.xxx.xxx 未訂閱
谢谢japhenchen的精彩回答,我要是早看到就好了,在没看到前我是这样解决的,服务端使用INDYSERVER,但客户端使用TCLIENTSOCKET,呵呵,没想到这两个控件配合效果很好,japhenchen兄你通过判断idtcpclient.InputBuffer.Size>0 的方法我也试过,这样在服务器没有信息传来的时候不会出任何问题,但如果服务器不断发送信息回来问题就又出现了,估计INDY的问题挺大的,其实我个人认为INDY的SERVER很好,但CLIENT就不行了,建议大家使用INDYSERVER和TCLIENTSOCKET的组合。 另外提个醒,TCLIENTSOCKET发送SENDTEXT时由于使用BUFFER发送,BUFFER长度使用的是INTEGER型所以大家注意发送内容的长度,不要大于INTEGER的最大值,超过了分段发就好了。
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-30 13:27:43 IP:211.75.xxx.xxx 未訂閱
引言: >另外提个醒,TCLIENTSOCKET发送SENDTEXT时由于使用BUFFER发送,BUFFER长度>使用的是INTEGER型所以大家注意发送内容的长度,不要大于INTEGER的最大 >值,超过了分段发就好了。
請問BUFFER如何分段讀取出來? 有方法可以偵測BUFFER內的長度嗎? 分享比獲得更快樂--Juneo
jackalan
初階會員


發表:20
回覆:88
積分:36
註冊:2003-11-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-30 14:15:50 IP:61.155.xxx.xxx 未訂閱
不需要分段读取Buffer啊,我的意思是发送时判断一下发送的长度,如果超过INTERGER上限发送时就分成几段,至于怎么接收其实也就是发送分段内容时先发个标志,发送结束在发个标志,根据服务端的发送将发来的数据合并就可以了。 ======================= 无情剑客多情剑
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-26 13:51:31 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-18 13:28:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!