Einzelnen Beitrag anzeigen

ASKtec

Registriert seit: 19. Okt 2007
38 Beiträge
 
#1

Indy10 IdTCPServer Problem

  Alt 8. Nov 2008, 23:43
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 <> 'NOOPthen
    Log.Lines.Add(TimeToStr(now) + ': ' + ip + ' ' + text);
  if Command = 'TITLEthen
    title := text;
  if Command = 'HELOthen
    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
  Mit Zitat antworten Zitat