各位大哥:
请教一个困扰了小弟好久的一个问题:在服务器端使用IdTCPServer的时候,当客户端非正常断开连接(比如:杀死程序)时,IdTCPServer不能触发OnDisconnect事件,Socket线程依然还存在,过了一个晚上来看还没有释放。但是当我的客户端再次连接上来时,该老的Socket线程又会立刻释放掉。请问有什么好的方法能够比较实时的检测到Socket已经断掉了呢? 我们的这个程序在国内跑是没有碰到什么问题的,可是前段时间在国外演示时,一天下来开了上百个Socket线程不能释放掉。很可能是他们的网络不好造成的,但是奇怪为什么Socket断掉了线程还不自动释放呢? 请高手指点迷津!
请教一个困扰了小弟好久的一个问题:在服务器端使用IdTCPServer的时候,当客户端非正常断开连接(比如:杀死程序)时,IdTCPServer不能触发OnDisconnect事件,Socket线程依然还存在,过了一个晚上来看还没有释放。但是当我的客户端再次连接上来时,该老的Socket线程又会立刻释放掉。请问有什么好的方法能够比较实时的检测到Socket已经断掉了呢? 我们的这个程序在国内跑是没有碰到什么问题的,可是前段时间在国外演示时,一天下来开了上百个Socket线程不能释放掉。很可能是他们的网络不好造成的,但是奇怪为什么Socket断掉了线程还不自动释放呢? 请高手指点迷津!
解决方案 »
- delphi groupbox控件 标题透明问题
- DLL 中窗体消息循环求助
- 利用函数或处理过程调用多个 frame 的问题
- object pascal的基础语法是什么?
- 怎么将UpDown和edit关联?
- 请大家介绍一个数据同步软件,不知道的帮忙UP
- 我想请教一下:avi文件支持左右声道切换吗?
- 有说知道在那里可以下载snccurrency这个控件?答对分全给他!
- 哪里有把MP3转换成WAV文件的控件(DELPHI6)
- 做过报表的请进!绝对菜问题!
- 大家推荐一个双机热备份的软件?
- 超难问题!!!! 如何 修改 cxDateEdit 控件 下拉 选择日期 里面 按钮 文字???? 急!!!!!!!!
我觉得不用发送检测包,因为如果网络有问题(如:拔掉网线、禁用网卡、强行关闭)都会导致服务器端的读写异常,在这时只须捕获异常并调用善后处理函数即可。
在你的IdTCPServer的Execute中使用以下结构试试。
*)
with AThread,Connection do
begin
try
//收、发操作
except
on E:Exception do
begin
Disconnect;
Terminate;
end;
end;
end;
假如网络故障,即使你使用检测包知道网络有问题,但找出无效连接也是一件麻烦的事。