datasnap 2010 心跳包,连接断开处理

datasnap 2010 心跳包,连接断开处理
procedure TMainForm.DSServer1Connect
(DSConnectEventObject: TDSConnectEventObject);
var
// RowIndx: Integer;
InVal: TCP_KeepAlive;
Ret: DWORD;
ClientConnection: TIdTCPConnection;
begin
EnterCriticalSection(CSConnect);
try
// 最大连接数量,验证来访者密码
if (ConnectCount >= 500) or (DSConnectEventObject.ChannelInfo = nil) or
(DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName]
<> 'sunstone') or (DSConnectEventObject.ConnectProperties
[TDBXPropertyNames.Password] <> 'mypassword') then
begin
// ClientConnection.Disconnect;
DSConnectEventObject.DbxConnection.Destroy;
Exit;
end
else
begin
// 获取socket连接
ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);

// 同IP连接频率控制
// for RowIndx := ShowConnections.RowCount - 1 downto 1 do
// begin
// if AnsiPos(ClientConnection.Socket.Binding.PeerIP + ':',
// ShowConnections.Cells[1, RowIndx]) > 0 then
// begin
// if SecondsBetween(Now,
// StrToDateTimeDef(ShowConnections.Cells[4, RowIndx], Now)) >= 1 then
// begin
// Break;
// end
// else
// begin
// DSConnectEventObject.DbxConnection.Destroy;
// Exit;
// end;
// end;
// end;

// 设置心跳包
Ret := 0;
InVal.OnOff := 1;
InVal.KeepAliveTime := 4000;
InVal.KeepAliveInterval := 1;
if WSAIoctl(ClientConnection.Socket.Binding.Handle,
IOC_IN or IOC_VENDOR or 4, @InVal, sizeof(TCP_KeepAlive),
nil, 0, @Ret, nil, nil) = SOCKET_ERROR then
begin
DSConnectEventObject.DbxConnection.Destroy;
Exit;
end;

// 建立网络异常断开事件
ClientConnection.OnDisconnected := ClientDisconnectEvent;

// 显示来访者信息
inc(ConnectCount);
ConnectInfo.Panels.Items[1].Text := IntToStr(ConnectCount);

if Trim(ShowConnections.Cells[0, 1]) <> '' then
ShowConnections.RowCount := ShowConnections.RowCount + 1;

ShowConnections.Cells[0, ShowConnections.RowCount - 1] := IntToStr
(DSConnectEventObject.ChannelInfo.Id);
ShowConnections.Cells[1, ShowConnections.RowCount - 1] :=
ClientConnection.Socket.Binding.PeerIP + ':' + IntToStr
(ClientConnection.Socket.Binding.PeerPort);
ShowConnections.Cells[2, ShowConnections.RowCount - 1] :=
DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName];
ShowConnections.Cells[3, ShowConnections.RowCount - 1] :=
DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];
ShowConnections.Cells[4, ShowConnections.RowCount - 1] := FormatDateTime
('yyyy-mm-dd hh:nn:ss', Now);
end;
finally
LeaveCriticalSection(CSConnect);
end;
end;
 

转载于:https://www.cnblogs.com/leonkin/archive/2012/02/22/2363707.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值