AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy10 IdTCPServer Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Indy10 IdTCPServer Problem

Ein Thema von ASKtec · begonnen am 9. Nov 2008 · letzter Beitrag vom 9. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
ASKtec

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

Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 00: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
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 00:54
Die VCL ist nicht Threadsicher, benutze deshalb Kritische Abschnitte.

Delphi-Quellcode:
uses ..., SyncObjs;

type
  :
  private
    { Private-Deklarationen }
    FCriticalSection:TCriticalSection;
  :
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCriticalSection:=TCriticalSection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FCriticalSection.free;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
:
begin
  :
  FCriticalSection.Enter;
  try
    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;
  finally
    FCriticalSection.Leave;
  end;
end;
  Mit Zitat antworten Zitat
ASKtec

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

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 01:20
Hallo,

vielen Dank für die schnelle Antwort. Ich habe es gleich ein gebaut...

Nun muss ich nur mal noch ne einfach Erklärung finden, was genau diese Kritische Abschnitte sind und machen 8)

Gruß
Andreas
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 01:23
klick
  Mit Zitat antworten Zitat
ASKtec

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

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 02:01
Danke für den Link...

Aber der Server macht immernoch das gleiche. Wobei ich diesmal auch sehen konnte dass der Server eine CPU Last von 49% hatte als nichts mehr ging...

Hat vielleicht noch jemand eine Idee??? Gibt es vielleicht eine gute Alternative zu den Indy-Komponenten die ich nutzen könnte?

Gruß und Danke
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#6

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 10:30
hast du schon mal versucht den server zu debuggen?
also schritt für schritt durchgehen und schauen wann er hängen bleibt
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
ASKtec

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

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 12:58
Hallo gsh,

nein noch nicht wirklich. Das Problem tritt erst nach ca 45 min bis 1 Stunde auf. Ich werde nun mal jeden Schritt in ein Logfile eintragen. Vieleicht kommt dabei was zu Tage. Da er alle 3-4 Minuten Daten empfängt und diese dann an 3 Clients verteilt sind das viele Schritte die 1000 mal funktionieren und dann plötzlich nicht mehr

Ich dachte, dass vielleicht jemand die Problematik hier bekannt ist...

Ich werde nun mal das Logfile integrieren und dann mal schauen ob es neue Erkenntnisse bringt.

Gruß
Andreas
  Mit Zitat antworten Zitat
ASKtec

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

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 15:01
So, neue Erkenntnisse aus dem Logfile....

Hier mal zuerst die Auszüge aus dem Logfile wie es regelmäßig erscheint und auch in Ordnung ist:

Delphi-Quellcode:
09.11.2008 14:39:17: OnExecute durch: 127.0.0.1
09.11.2008 14:39:28: 192.168.100.207: NOOP:
09.11.2008 14:39:28: 192.168.100.207: CriticalSecion Enter passed
09.11.2008 14:39:28: 192.168.100.207: Contexts.LockList passed
09.11.2008 14:39:28: Schleife beginnt
09.11.2008 14:39:28: 127.0.0.1(0): WriteLN passed
09.11.2008 14:39:28: 192.168.100.207(1): WriteLN passed
09.11.2008 14:39:28: 192.168.100.65(2): WriteLN passed
09.11.2008 14:39:28: 127.0.0.1: NOOP:
09.11.2008 14:39:28: Schleife Ende
09.11.2008 14:39:28: 192.168.100.207: Contexts.UnlockList passed
09.11.2008 14:39:28: 192.168.100.207: CriticalSecion.Leave passed

Und so sieht es aus wenn es kracht:

Delphi-Quellcode:
09.11.2008 14:39:28: OnExecute durch: 192.168.100.207
09.11.2008 14:39:43: 192.168.100.65: NOOP:
09.11.2008 14:39:50: OnConnect mit: 127.0.0.1
09.11.2008 14:39:50: OnExecute durch: 127.0.0.1
09.11.2008 14:39:50: 127.0.0.1: HELO:client
09.11.2008 14:39:58: 192.168.100.207: NOOP:
Hier ist auffällig, dass in einem OnExecute-Event plötzlich ein OnConnect und ein weiteres OnExecute ausgelöst wird. Hierbei kommt die Komponente wohl ins schleudern und bleibt stecken...

Nur wie kann ich das verhindern???

Viele Grüße und Danke
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 15:15
Dann versuche mal, die gleiche Critical Section auch im OnConnect (und am besten auch im OnDisconnect) zu verwenden. Damit wird ausgeschlossen, dass eine Event eintritt, während ein anderes gerade behandelt wird
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Indy10 IdTCPServer Problem

  Alt 9. Nov 2008, 16:08
Dein Log-Objekt ist eine StringList, die ist auch nicht Threadsafe! Die ist mir gestern gar nicht weiter aufgefallen.

Eine andere Möglichkeit ist, wenn dein Server intern sowieso nur einmal betreten werden darf, die MaxConnection-Eigenschaft des Servers auf eins zu setzen. Das wird dann allerdings deine Verbidungsgeschwindigkeit drosseln, weil die Indys dann diesen Schutz für dich organisieren. Dies geht allerdings nur, wenn sich die Clients jedesmal an-/abmelden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz