怎么样在indy server中检测到客户端的异常断线(例如断电),文章附部分程序(100分)

  • 主题发起人 主题发起人 soulmate
  • 开始时间 开始时间
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
//会检测不到吗?
Self.Caption := Format('IP: %s, Port: %d', [AThread.Connection.Socket.Binding.PeerIP, AThread.Connection.Socket.Binding.PeerPort])
end;///我的这样全部检测到了。

procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
begin
//这里面检测异常断线
end;
应该检测得到客户端断开,可能是你的程序用错误吧。
//看看Indy这个过程处理异常断线 IdTCPServer.pas line: 792
on E: EIdSocketError do begin
Connection.Server.DoException(Self, E);
case E.LastError of
Id_WSAECONNABORTED // WSAECONNABORTED - Other side disconnected
, Id_WSAECONNRESET:
Connection.Disconnect;


Socket正常断开或非正常断开都会有通知的。
API里面可以用FD_CLOSE来判定断开,非正常断开会有
WSAECONNABORTED这样一标志到另一端。
你收标志做相应的处理就行了.
 
fxh7662和jfyes,谢谢~不过你们的方法都没用~!
顶啊~
 
也许我没有把情况说清楚,我用Indy Server监听,客户端是GPRS,你可以把它看做一个客户端,当我断电的时候,服务器就检测不到断线,如果我用指令对GPRS操作,使它按指令断开网络,Indy Server 的Disconnect是可以检测到的~在Disconnect事件中我只是在Memo中显示断线的地址。

procedure TMainFrm.IdTCPServerDisconnect(AThread: TIdPeerThread);
begin
Meo_Rec.Lines.Add('来自主机 '
+ AThread.Connection.Socket.Binding.PeerIP
+ ' 的连接已中断!');
end

问题是,大多情况下客户端的断线是随机的,例如断电,我想这样也能检测到,在这种情况下,当断电时,Indy server没有反映,当按下停止网络或关闭程序时,过大约5每秒抛出一个异常,Time out,然后你要是再按停止键就可以完成原来停止键的功能了~
 
还是没有人会吗?
 
Idtcpclient连接到IdTcpserver之后 拔掉网线,服务器如何检测到 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2651464

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;
 
我这样用的不行啊~为什么?急~客户端是计算机也不行~我原本是想给gprs来用的~
procedure TMainFrm.IdTCPServerConnect(AThread: TIdPeerThread);
type
TCP_KeepAlive = record
OnOff: Cardinal;
KeepAliveTime: Cardinal;
KeepAliveInterval: Cardinal
end;
var
Val: TCP_KeepAlive;
Ret: DWord;
begin
Meo_Rec.Lines.Add('来自主机 '
+ AThread.Connection.Socket.Binding.PeerIP
+ ' 的连接请求已被接纳!');

Val.OnOff:=1;
Val.KeepAliveTime:=3000;
Val.KeepAliveInterval:=1;
WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@Val, SizeOf(Val), nil, 0, @Ret, nil, nil);

end;

procedure TMainFrm.IdTCPServerException(AThread: TIdPeerThread;
AException: Exception);
begin
Meo_Rec.Lines.Add('来自主机 '
+ AThread.Connection.Socket.Binding.PeerIP
+ ' 的连接已中断!');
end;
 
我在接收里是这样处理的~
procedure TMainFrm.IdTCPServerExecute(AThread: TIdPeerThread);
var
len:integer;
sCommand: array[0..4096] of char;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
try
FillChar(sCommand,sizeof(sCommand),#0);
len:=AThread.Connection.ReadFromStack(false,-1,false);

if len>0 then
begin
AThread.Connection.ReadBuffer(sCommand,len);
Meo_Rec.Lines.Add('Asc显示为:'+sCommand);
Meo_Rec.Lines.Add('Hex显示为:'+EncodeHEX(sCommand,len))
end;

except

end;
end;

end;
 
ding~总会有人知道的~
 
轰轰烈烈的顶~
 
不用顶了,俺来
在socket 的onconnected里面加入对掉线的检测
 
能贴出来看看吗?在onconnected事件里我也实验了,但是没有成功~
 
麽用~看看最近有人知道么~
 
indy10 在onExecute里面改进了
client-->tcpserver
|
onconnect
|
--> onexecute
| |
<--checkconnection
|
omdisconnect
 
后退
顶部