社区
网络通信/分布式开发
帖子详情
请问如何在程序退出时断开IdTCPServer所有还在连接的线程?
zhouweiyong123
2007-12-16 06:25:51
如题,我在程序退出的时候总是产生异常。请大家指点。
...全文
373
5
打赏
收藏
请问如何在程序退出时断开IdTCPServer所有还在连接的线程?
如题,我在程序退出的时候总是产生异常。请大家指点。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
Q
TcpServer
多
线程
实现
Q
TcpServer
多
线程
实现 目的:每个客户端
连接
的tcpSocket分别分配一个专门的
线程
来处理。 实现
时
分别继承Q
TcpServer
和QTcpScoket实现出自己需要的类。 继承Q
TcpServer
为每个客户端
连接
时
分配
线程
,并接受处理tcpScoket的信号和槽、、还有发送信息,储存
连接
信息等。 继承QTcpScoket为处理通信数据和增加信号的参数,以便和
tcpServer
关于Delphi 10.4.2 T
Id
TCPServer
的多
线程
通信使用
前几年在博客看到有人写过类似的例子,但是都忘记了,无奈最近由于项目需要用到 所以又重新研究了一下T
Id
TCPServer
和T
Id
TCPClient控件 以前有写过Indy 10发送数据的例子, 不懂的朋友可以在这里下载: https://download.csdn.net/download/zhou752947/10213169 使用的是Delphi 10.2.2,但是最近我用Delphi10.4.2编译后发现传输文件有问题,其他都正常,有
时
间的朋友自己研究去吧 进入正题:
ID
E工具:Delphi 10.
Id
TCPClient /
Id
TCPServer
+ 心跳机制
客户端: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,
Id
AntiFreezeBase,
Id
AntiFreeze,
Id
BaseComponent,
Id
Comp
delphi
id
tcpclient和
id
tcpserver
的心跳包
delphi
id
tcpclient和
id
tcpserver
的心跳包 最近有个项目需要用到socket通信,对于socket的网络异常处理(
程序
异常
退出
或者网络掉了)及重连纠结了好久,网上虽然有很多资料,但是都是从一个地方转过来的,不够详细,查了很久的资料才弄出来的,原来的出处给忘了。 环境:delphi7+indy控件(dephi7自带) 工作需要才用delphi7,...
网络通信/分布式开发
1,593
社区成员
32,964
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章