老调重提:如何释放已断开的ServerSocket.Socket.ActiveConnections的资源

huangshy85 2012-04-19 02:17:35
如题,如何释放已断开的ServerSocket.Socket.ActiveConnections的资源.

如果有现成例子参考的请发送到huangshy@foxmail.com,另开帖送分
...全文
236 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhhaifeng 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
发送心跳包
UseInfo_Record=record
UseSocket: TCustomWinSocket; //用于连接客户的套接字
sUSUEID:string;//用户唯一ID
LastTime:TDateTime; //最后接收信息的时间
iStatus:integer;
end;
记录下每个客户端的信息
每次心跳包到的时候 修改 Las……
[/Quote]
??
huangshy85 2012-05-10
  • 打赏
  • 举报
回复
还是无法实现啊!请各位再给给力;
只在服务端如何判断客户端是否已经断开连接,也就是单向心跳包的设计,求解!
mhhaifeng 2012-05-02
  • 打赏
  • 举报
回复
以keepalive为关键字在百度搜下 答案
这是个比较无解的问题
当客户端非正常断开 服务端是不知道的,会一直保持连接状态 所有系统都是这样
只能自己判断了
山东蓝鸟贵薪 2012-04-19
  • 打赏
  • 举报
回复
你说的是三层的问题吗
如何是三层的是可自动释放的
mhhaifeng 2012-04-19
  • 打赏
  • 举报
回复

http://www.west263.com/info/html/wangluobiancheng/qita/20080411/63944.html
mhhaifeng 2012-04-19
  • 打赏
  • 举报
回复
发送心跳包
UseInfo_Record=record
UseSocket: TCustomWinSocket; //用于连接客户的套接字
sUSUEID:string;//用户唯一ID
LastTime:TDateTime; //最后接收信息的时间
iStatus:integer;
end;
记录下每个客户端的信息
每次心跳包到的时候 修改 LastTime:TDateTime; //最后接收信息的时间

设置定显示器 Timer 每隔段时间检查 LastTime
如果 now -LastTime >心跳包时间间隔 即认为断线了
socket.close;

可用 TList 链表保存维护第个客户的UseInfo_Record的信息
pUseInfo:^UseInfo_Record
for i:=List.count-1 downto 0 do
begin
pUseInfo:= List[i];
if now-pUseInfo.lastTime>25 then
begin
pUseInfo.UseSocket.close;
dispose(pUseInof);
List.delete(i);
end;
end;
List.add(pUseInfo);当客户连接到时 新增一条记录 填充 pUseInfo
List.delete(i);

大概是以上样子


1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧