请问如何在程序退出时断开IdTCPServer所有还在连接的线程?

zhouweiyong123 2007-12-16 06:25:51
如题,我在程序退出的时候总是产生异常。请大家指点。
...全文
226 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
编码人11 2007-12-19
将所有连接保存在一个 TThreadList里面,程序关闭是 断开
回复
编码人11 2007-12-18
最好让自己推出
回复
yuehaiyang 2007-12-17
如果客户端也是自己做的话,可以发退出命令给客户端,让他们自己退出。
回复
CYDong0423 2007-12-17
IdTcpServer还存在的问题客户非正常关闭连接无法断开解决

WinSock1方法
可以考虑用TCP自己的保活定时器,他的作用是每隔一段时间检查一下连接是否正常,如果不正常则报告给应用层。
用下面的方法试试,理论上应该是对的,偶没有实际测试:

uses WinSock;

在TCPServer的OnConnection事件里加上如下的片段:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
type
TCP_KeepAlive = record
OnOff: Cardinal;
KeepAliveTime: Cardinal;
KeepAliveInterval: Cardinal
end;
var
Val: TCP_KeepAlive;
Arg: Integer;
begin
Val.OnOff:=1;
Val.KeepAliveTime:=xxx;
Val.KeepAliveInterval:=xxx;
Arg:=Integer(@Val);
ioctlsocket(AThread.Connection.Socket.Binding.Handle,
$80000000 or $18000000 or 4, Arg);
end;

TCP_KeepAlive里的参数的意义是显而易见的,就不多说了。
然后连接将自动按指定间隔测试是否正常,作为应用程序可以在TCPServer的OnException里守着就行了。
WinSock2方法
uses WinSock2;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
type
TCP_KeepAlive = record
OnOff: Cardinal;
KeepAliveTime: Cardinal;
KeepAliveInterval: Cardinal
end;
var
Val: TCP_KeepAlive;
Ret: DWord;
begin
Val.OnOff:=1;
Val.KeepAliveTime:=xxx;
Val.KeepAliveInterval:=xxx;
WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@Val, SizeOf(Val), nil, 0, @Ret, nil, nil)
end;
回复
CYDong0423 2007-12-17

退出IdTcpServer异常解决

要这样结束
try
with TCPServer.Threads.LockList do
begin
for i := 0 to Count- 1 do
begin
try
Athread := Items[i];
Athread.Terminate;
Athread.Connection.Disconnect;
except
end;
end;
end;

finally
TCPServer.Threads.UnlockList;
TCPServer.Active := false;
end;
回复
发动态
发帖子
网络通信/分布式开发
创建于2007-08-02

1566

社区成员

Delphi 网络通信/分布式开发
申请成为版主
社区公告
暂无公告