Moin!
Ich habe einen
FTP-Server mit
Indy 10.5.5 gebastelt. Die Clients sind mobile Geräte, die unter VB.net programmiert wurden. Es kommt vor, dass die Verbindung abbricht (kein Netzempfang, Gerät wird während der Übertragung ausgeschaltet, Bombeneinschlag
, etc).
Nun bleiben die Verbindungen aber im
FTP-Server stehen. Die würde ich gern nach einer gewissen Zeit rauswerfen. Dafür erstelle ich mir im Context.Data der Clientverbindung ein Objekt, das unter anderem einen sog. Heartbeat enthält. Immer wenn der Client irgendwie mit dem Server kommuniziert, wird dieser Heartbeat aktualisiert.
Nun habe ich einen Timer erstellt, der alle 10 Sekunden ausführt wird. Der prüft, ob der letzte Heardbeat mehr als x Sekunden her ist und soll dann evtl. den Client einfach rauswerfen:
Delphi-Quellcode:
procedure TfrmFTP.tmrDisconnectTimer(Sender: TObject);
var
l : TList;
context : TIdFTPServerContext;
i : Integer;
ui : TUserInfo;
begin
inherited;
l :=
Ftp.Contexts.LockList;
try
for i := 0
to l.Count - 1
do
begin
context := TIdFTPServerContext(l.Items[i]);
if TryGetUserInfo(context, ui)
then
begin
if GetTickDiff(ui.LastHeartbeat, GetTickCount) >= FTimeout
then
begin
AddLogMessage(context, '
Client wird zwangsgetrennt (Timeout)', ltHint);
context.Connection.Disconnect(False);
end;
end;
end;
finally
ftp.Contexts.UnlockList;
end;
end;
Dieses Vorgehen klappt in 95% der Fälle. Aber es gibt einige Fälle, wo die Verbindung in der Liste bestehen bleibt. Obwohl der Client definitiv nicht mehr da ist (Gerät ausgeschaltet). Trotzdem bekomme ich auf diese Art den Client nicht rausgeworfen. So läuft das Programm alle 10 Sekunden in diesen Programmteil und der Kunde sieht alle 10 Sekunden diesen Logtext (Client wird zwangsgetrennt..)
Ich kann nicht wirklich nachvollziehen, woran das liegt. Ich hab auch Probleme, dieses Problem bei mir im Büro nachzustellen. Denn natürlich tritt das nur beim Kunden auf und nicht bei mir. Wie gesagt in 95% der Fälle funktioniert das. Ich schalte den Client während der Übertragung aus: funktioniert. Ich verbinde mich mit der Windows
FTP.exe und kille während der Übertragung den
FTP.exe-Prozess: funktioniert.
Tipps, Hinweise, wilde Spekulationen sind willkommen!
Jens