我用IdTcpServer作服务端,两个控件,一个短连接,一个长连接,都发现在客户短连接断开N次过后,可不断不能在连接到服务器,而两个控件的active属性都是true.
不知道为什么会这样,有什么办法能主动侦测到这种情况然后采取恢复措施?
不知道为什么会这样,有什么办法能主动侦测到这种情况然后采取恢复措施?
解决方案 »
- 怎样判断一组值(两个变量),在一个范围内,具体看内容?
- 关于c/s的一个弱弱的问题1
- 在delphi 6 中设置断点,但是程序不中断,什么原因?
- ADOConnection的ConnectionTimeout不起作用?
- 菜鸟求助~请高手赐教,请问如何屏蔽掉机箱上复位按钮的功能?
- 关于程序继承的问题,请大家帮我看看。
- 请问Excel控件
- 各位:有谁知道dbgrid.columns的picklist如何使用?
- 谁能帮我介绍windows启动加载vxd文件吗?在什么地方放入相关语句?
- 象IE中的CoolBar中工具栏、地址栏隐藏时如何实现的!
- [简单问题]关于连接的SQL 语句
- 请教一下MSHTML的问题
例如NOOP等
我用IDTCPSERVER时碰到过这种情况。一个线程一个连接,用完后释放。结果最后在查询分析器里发现连接并没有断开。而是一直增长。最后导致SQLSERVER超过最大连接数。不能再连接了。我也发了帖子,可问题没解决,最后只能用TSERVERSOCKET单线程实现了
而且这样的做法还不如用udp做(短连接)
procedure TFrmMain.IdTCPDataExecute(AThread: TIdPeerThread);
var
ReadStr:string;
LCMD:integer;
buftmp:array [0..511] of byte;
begin
try
AThread.FreeOnTerminate:=true;
ReadStr:=AThread.Connection.CurrentReadBuffer();
copymemory(@buftmp,@Readstr[1],length(ReadStr));
if length(ReadStr)=0 then
begin
exit;
end;
ReadStr:=DeCode(buftmp,length(readstr));
memolock.Acquire;
try
if memorecv.Lines.Count>200 then memorecv.Lines.Clear;
if CBMemo.Checked then
begin
memorecv.Lines.Append(datetimetostr(now)+' '+AThread.Connection.Binding.PeerIP+':'+inttostr(AThread.Connection.Binding.PeerPort));
memorecv.Lines.Append(ReadStr);
end;
except
end;
memolock.Release; try
LCMD:=strtoint(leftstr(readstr,pos('&',readstr)-1));
except
LCMD:=0;
end;
ReadStr:=rightstr(ReadStr,length(ReadStr)-6);
case LCMD of
97863:begin
AThread.Connection.WriteLn('OK');
if pos('11660',ReadStr)>0 then
begin
AThread.Connection.Disconnect;
AThread.Terminate;
exit;
end;
ProcessRecvMeg(ReadStr);
end;
97862:begin
AThread.Connection.WriteLn('OK');
DoSql(ReadStr);
end;
else
AThread.Connection.WriteLn('ERROR');
WriteLog(extractfilepath(application.ExeName)+'Games.log','DATA数据读取错。' );
end;
except on e:exception do
begin
WriteLog(extractfilepath(application.ExeName)+'Games.log',e.Message );
end;
end;
AThread.Terminate;
end;