Einzelnen Beitrag anzeigen

Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

TIdTCPServer im Dienst kann nicht "resetet" werden

  Alt 11. Jun 2008, 12:50
hi

ich erstelle einen tcp server zur laufzeit (indy10) in meiner dienstanwendung, die kommunikation läuft wie gewünscht mit dem entsprechenden anderen tool...

nach der interaktion soll nun der tcp server neu "aufgesetzt" werden...
d.h. max connections := 0...

wenn eine exception auftritt, soll der server so zurückgesetzt werden, dass wieder eine eingehende verbindung angenommen wird...

damit alles sauber verläuft möchte ich die komponente zerstören und neu erstellen, ich kriegs aber einfach nicht hin...
hab schon 1000 varianten probiert ohne erfolg jedoch.

so sollte es z.b. aussehen:

Delphi-Quellcode:
// RE/ACTIVATE TCP SERVER
procedure TSisterWatch.ActivateTCPServer;
var
  i,port: Integer;
  Cont:TIdContext;
begin
  if fulllog then LogFile.Log(msg0045);

  if assigned(TCPServer) then
  begin
    if fulllog then LogFile.Log('1 assigned');
    if TCPServer.Active then
    begin

//// disconnect clients (it should not have some established)
// for i:=TCPServer.Contexts.LockList.Count-1 downto 0 do
// begin
// Cont:=TIdContext(TCPServer.Contexts.LockList.Items[i]);
// Cont.Connection.Disconnect;
// end;
// TCPServer.Contexts.Clear;
// TCPServer.Contexts.UnLockList;

// if fulllog then LogFile.Log('1.2 is active try to set inactive');
// TCPServer.Active := false;
// if fulllog then LogFile.Log('1.3 successfully deactivated');
    end;
    //if fulllog then LogFile.Log('2 deactivated');
    //TCPServer.Bindings.Clear;
    //if fulllog then LogFile.Log('3 bindings cleared');
    //TCPServer.Contexts.Clear;
    //if fulllog then LogFile.Log('4 contexts cleared');
    //FreeAndNil(TCPServer);
    if fulllog then LogFile.Log('cleanup instance');
    TCPServer.CleanupInstance;
    if fulllog then LogFile.Log('5- try to destroy');
    TCPServer.Free;
    if fulllog then LogFile.Log('5 destroyed');
  end;

  // create the server new
  TCPServer := TIdTCPServer.Create(Self);
  if fulllog then LogFile.Log('6 created new');
  // link server actions

  if assigned(TCPServer) then
  begin
    if fulllog then LogFile.Log('7 assigned');
    TCPServer.OnExecute := TCPServerExecute;
    if fulllog then LogFile.Log('8 applyed on execute');
    // enough error handling in TCPServerOnExecute...
    //TCPServer.OnException := TCPServerException;
    TCPServer.OnConnect := TCPServerConnect;
    if fulllog then LogFile.Log('9 applyed on connect');
    TCPServer.OnDisconnect := TCPServerDisconnect;
    if fulllog then LogFile.Log('10 applyed on disconnect');
    TCPServer.Active := false;
    if fulllog then LogFile.Log('11 active falsed');
    port := GetPort;
    if fulllog then LogFile.Log('12 get port');
    TCPServer.DefaultPort := port;
    if fulllog then LogFile.Log('13 set port');
    TCPServer.Active := True;
    if fulllog then LogFile.Log('14 activated now');
  end
  else
    if fulllog then LogFile.Log(msg0042);

  if fulllog then LogFile.Log('reactivate procedure ended..');
end;
da ichs nicht hinkriege den dienst zu debuggen, habe ich halt vorübergehend meldungen in ein log file umgeleitet, dasselbe passiert mit den exceptions...

die funktion wird in einem mit try except block ausgeführt, jedoch erhalte ich keine exception meldung...
wie auch immer die letzte meldung mit diesem code in meinem log ist: "-try to destroy"

Ich kann den TCPServer weder Active = False setzten noch freeen oder destroyen ... bei all diesen sachen bleibt der dienst einfach stehen..

worauf muss ich achten dass ich den server löschen und dann erneut erstellen kann?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat