社区
网络通信/分布式开发
帖子详情
请问如何在程序退出时断开IdTCPServer所有还在连接的线程?
zhouweiyong123
2007-12-16 06:25:51
如题,我在程序退出的时候总是产生异常。请大家指点。
...全文
420
5
打赏
收藏
请问如何在程序退出时断开IdTCPServer所有还在连接的线程?
如题,我在程序退出的时候总是产生异常。请大家指点。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
超龄编码人
2007-12-19
打赏
举报
回复
将所有连接保存在一个 TThreadList里面,程序关闭是 断开
超龄编码人
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;
Delphi
id
tcpserver
断开
与
连接
客户端
Delphi
id
tcpserver
断开
与
连接
客户端··
Id
TCPServer
如何段开和客户端的
连接
1、
请问
Id
TCPServer
如何段开和客户端的
连接
,现在有我写了一个SERVER端和一Client端
程序
,当Client先段开与SERVER的
连接
,SERVER再停掉服务没有问题,但是当Client没有段开
连接
而SERVER直接关闭服务就会报异常,我想在关闭SERVER前先关掉所有客户端的
连接
,试了很长
时
间都没有成功,
请问
怎么解决。SERVER用的是
Id
TCPServer
,Client用的是
Id
关于Delphi 10.4.2 T
Id
TCPServer
的多
线程
通信使用
至于多
线程
,官方文档就有说明,其实T
Id
TCPServer
运行过程中,当客户端
连接
成功后默认就是基于T
Id
SchedulerOfThreadDefault调度分配
线程
模式,为每个客户端
连接
都分配单独的处理
线程
,由于Windows
线程
的限制,Indy 似乎还有一种特殊的模式T
Id
YarnOfThread来代替传统
线程
,至于T
Id
YarnOfThread这里不做研究,开始上代码。这里主要是做一些自定义类
断开
连接
要处理的事情,这里就省略了。当我测试多个客户端
连接
时
问题就来了,
线程
会一直锁死。
Q
TcpServer
多
线程
实现
Q
TcpServer
多
线程
实现 目的:每个客户端
连接
的tcpSocket分别分配一个专门的
线程
来处理。 实现
时
分别继承Q
TcpServer
和QTcpScoket实现出自己需要的类。 继承Q
TcpServer
为每个客户端
连接
时
分配
线程
,并接受处理tcpScoket的信号和槽、、还有发送信息,储存
连接
信息等。 继承QTcpScoket为处理通信数据和增加信号的参数,以便和
tcpServer
关于 Indy 中 T
Id
TCPServer
在关闭
时
导致
程序
死机的Bug修复(delphi)
目录 一、bug症状 二、Bug存在的版本 三、Bug解决方案 一、bug症状 在使用indy的T
Id
TCPServer
控件
时
,我们打开服务
时
会设置控件属性Active为True,关闭服务
时
自然是设置控件属性Active为False。当我们打开T
Id
TCPServer
服务,然后有一些客 户端
连接
上,此
时
如果我们需要关闭TCP服务
时
,自然会设置控件属性Active为False,,大...
网络通信/分布式开发
1,594
社区成员
32,958
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章