AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy 10 TIdTCPServer in Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 TIdTCPServer in Thread

Ein Thema von schwa226 · begonnen am 5. Jan 2011 · letzter Beitrag vom 5. Jan 2011
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 22:38
Nochmal ich!

Jetzt bin ich auf noch ein Problem gestoßen:

Der Server läuft und der Client wartet auf Daten:
dTCPClient.IOHandler.ReadBytes(Buf, 16, False); Nun wird der Server beendet mit
Delphi-Quellcode:
  if Assigned(fTCP_Server) then
  begin
    if fTCP_Server.Contexts.LockList.Count > 0 then
    begin
      for i := fTCP_Server.Contexts.LockList.Count - 1 downto 0 do
      begin
        TIdContext(fTCP_Server.Contexts.LockList[i]).Connection.Disconnect;
        TIdContext(fTCP_Server.Contexts.LockList[i]).Connection.IOHandler.DiscardAll;
      end;
    end;
    fTCP_Server.Contexts.UnlockList;
    fTCP_Server.Active := false;
    FreeAndNil(fTCP_Server);
  end;
Alles passt, Server kann beendet werden.

Wenn nun aber der Client Daten an den Server schickt, egal ob dieser diese Auswertet oder nicht dann kann der Server wieder nicht beendet werden!

Also wenn der Client sowas macht:
IdTCPClient.IOHandler.Write(Buf, 16); Es steht dann wieder beim Active := False;
Delphi 2010, Update 4 & 5

Geändert von schwa226 ( 5. Jan 2011 um 22:47 Uhr)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#2

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 23:05
Habe die OnExecute des Servers jetzt so umgebaut.
Jetzt haut er den Client wieder raus und der Server kann beendet werden.

Mal schauen ob da noch was ist...
Delphi-Quellcode:
procedure TIndeed_Server.OnExecute(AContext: TIdContext);
var
  Active_Client : TIndeed_Client;
begin
  Active_Client := TIndeed_Client(AContext.Data);

  while AContext.Connection.Connected do
  begin
    if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      if not Terminated then
        Client_Command_Handler(Active_Client)
      else
        AContext.Connection.IOHandler.InputBuffer.Clear;
    end;

    AContext.Connection.IOHandler.CheckForDisconnect(False, True);
    AContext.Connection.CheckForGracefulDisconnect(False);
    SleepEx(1, true);
  end;
end
Beim Server schließen dürfen auch nicht die einzelenen Verbindungen beendet werden.
Sondern einfach nur:
Delphi-Quellcode:
  if Assigned(fTCP_Server) then
  begin
    fTCP_Server.Active := false;
    FreeAndNil(fTCP_Server);
  end;
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz