社区
网络通信/分布式开发
帖子详情
请问如何在程序退出时断开IdTCPServer所有还在连接的线程?
zhouweiyong123
2007-12-16 06:25:51
如题,我在程序退出的时候总是产生异常。请大家指点。
...全文
413
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;
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
delphi
id
tcpclient和
id
tcpserver
的心跳包
delphi
id
tcpclient和
id
tcpserver
的心跳包 最近有个项目需要用到socket通信,对于socket的网络异常处理(
程序
异常
退出
或者网络掉了)及重连纠结了好久,网上虽然有很多资料,但是都是从一个地方转过来的,不够详细,查了很久的资料才弄出来的,原来的出处给忘了。 环境:delphi7+indy控件(dephi7自带) 工作需要才用delphi7,...
Indy10中
id
TcpServer
和
id
TcpClient的异常解决
今天重写一个delphi7的CS架构的软件,原本自带的控件是Indy9。现在升级到Indy10,用delphi XE5开发。发现
id
TcpServer
与
id
TcpClient的一些异常导致内存报错。 1.
id
TcpServer
端需要先启动,
id
TcpClient再启动去connect,TCP通道才算是建立。
id
TcpClient如果优先启动,则建立不起来TCP通道。 解决方法:如果Cient先
网络通信/分布式开发
1,594
社区成员
32,958
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章