Hallo zusammen,
ich habe ein Problem mit einem
Indy IdTCPServer...
Der Server läuft eine gewisse Zeit (ca 1 Std) ohne Probleme. Innerhalb dieser Zeit bekommt er alle 3 min einen Nachricht, die er an die verbunden Clients (derzeit 3) übermittelt. Nur dann plötzlich steigt er aus und ich verstehe nicht warum. Die Applikation bleibt zu sehen, jedoch ist ein beenden nur noch über den Taskmanager drin und eine neue Verbindung nimmt er auch nicht mehr an...
Die
Indy-Komponenten habe ich gestern erst geupdated um zu vermeiden, dass evtl. mit einem älteren Release zusammenhängt...
Hier mal ein wenig Quellcode des Servers:
Der Server wird zur Laufzeit erstellt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1 := TIdTCPServer.Create(self);
IdTCPServer1.OnExecute := IdTCPServer1Execute;
IdTCPServer1.OnConnect := IdTCPServer1Connect;
IdTCPServer1.OnDisconnect := IdTCPServer1Disconnect;
LoadSettings;
IDTCPServer1.Active := true;
if IDTCPServer1.Active then
Log.Lines.Add(TimeToStr(now) + ': Server gestartet');
end;
Dann passiert im onExecute folgendes:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var text,
ip, command:
string;
i:Integer;
List: TList;
begin
text := Acontext.Connection.IOHandler.ReadLn;
ip := Acontext.Connection.Socket.Binding.PeerIP;
Command:= Copy(text, 1, Pos('
:', text)-1);
if Command <> '
NOOP'
then
Log.Lines.Add(TimeToStr(now) + '
: ' +
ip + '
' + text);
if Command = '
TITLE'
then
title := text;
if Command = '
HELO'
then
text := title;
ListView1.Clear;
List := IdTCPServer1.Contexts.LockList;
for i := 0
to List.Count - 1
do
begin
TidContext(List.Items[i]).Connection.IOHandler.WriteLn(text);
with Listview1.Items.Add
do
caption := TIdContext(List.Items[i]).Connection.Socket.Binding.PeerIP;
end;
IdTCPServer1.Contexts.UnlockList;
end;
OnConnect macht nur einen Eintrag in ein Memo (Log):
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
Log.Lines.Add('Verbindung: ' + AContext.Binding.PeerIP);
end;
und OnDisconnet;
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
Log.Lines.Add('Verbindungsabbruch: ' + AContext.Binding.PeerIP);
end;
Mache ich hier irgendwo einen Fehler? Der Client der die Daten schickt bleibt ständig verbunden und zeigt auch weiterhin verbunden an, obwohl er im Server nicht mehr sichtbar ist (ich schicke vom Client aus zwischendurch eine Nachricht um festzustellen ob er noch lebt)...
Wer kann mir helfen?
Vielen Dank im voraus
Andreas