user Windows, IdWinsock2, IdTCPConnection;
procedure T****.CMServerConnect(DSConnectEventObject: TDSConnectEventObject);
var
ClientConnection: TIdTCPConnection;
val: TCP_KeepAlive;
Ret: Integer;
EnterCriticalSection(FSection); //进入临界区
if DSConnectEventObject.ChannelInfo <> nil then
begin
ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
ClientConnection.OnDisconnected := ClientDisconnectEvent; // 异常退出,这句是关键
// 设置心跳包,如果不能运行,要引用winsock2单元
val.OnOff := 1;
val.KeepAliveTime := 5000;
val.KeepAliveInterval := 3000;
WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@val, SizeOf(val), nil, 0, @Ret, nil, nil);
end;
LeaveCriticalSection(FSection);
end;
procedure T****.ClientDisconnectEvent(Sender: TObject);
var
ClientConnection: TIdTCPConnection;
ClientID: Integer;
begin
EnterCriticalSection(FSection);
ClientConnection := Sender as TIdTCPConnection;
ClientID := Integer(ClientConnection);
LeaveCriticalSection(FSection);//离开临界区
DeleteCriticalSection(FSection);//删除临界区
end;
private
FSection: TRTLCriticalSection; //临界区
procedure T****.CMServerConnect(DSConnectEventObject: TDSConnectEventObject);
var
ClientConnection: TIdTCPConnection;
val: TCP_KeepAlive;
Ret: Integer;
begin
InitializeCriticalSection(FSection); //初始化临界区EnterCriticalSection(FSection); //进入临界区
if DSConnectEventObject.ChannelInfo <> nil then
begin
ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
ClientConnection.OnDisconnected := ClientDisconnectEvent; // 异常退出,这句是关键
// 设置心跳包,如果不能运行,要引用winsock2单元
val.OnOff := 1;
val.KeepAliveTime := 5000;
val.KeepAliveInterval := 3000;
WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@val, SizeOf(val), nil, 0, @Ret, nil, nil);
end;
LeaveCriticalSection(FSection);
end;
procedure T****.ClientDisconnectEvent(Sender: TObject);
var
ClientConnection: TIdTCPConnection;
ClientID: Integer;
begin
EnterCriticalSection(FSection);
ClientConnection := Sender as TIdTCPConnection;
ClientID := Integer(ClientConnection);
LeaveCriticalSection(FSection);//离开临界区
DeleteCriticalSection(FSection);//删除临界区
end;
本文介绍了一种基于TCP连接的服务器连接方法,并设置了心跳包机制来维持连接的有效性。此外,还实现了一个客户端异常断开连接时的处理事件。
1126

被折叠的 条评论
为什么被折叠?



