Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IdTCPServer in Dienstanwendung (https://www.delphipraxis.net/170630-idtcpserver-dienstanwendung.html)

TUX_der_Pinguin 26. Sep 2012 11:36

Delphi-Version: 2009

IdTCPServer in Dienstanwendung
 
Hi,

ich habe einen Dienst erstellt indem ein TCP Server aus der INDY (10.2.5, Original von Delphi 2009) Sammlung verwendet werden soll.
Im OnCreate des Dienstes soll der Server initialisiert und im OnDestroy wieder deinitialisiert werden. Die Komponente TIdTCPServer habe
ich auf ein TDataModule gezogen.

Das folgende klappt wunderbar, der Server funktioniert.

Delphi-Quellcode:
procedure TSvcMain.ServiceCreate(Sender: TObject) begin
  try
    DMTCPServer.Start;
  except
    //Fehlermeldung
  end;{try..except}
end;
Delphi-Quellcode:
procedure TDMTCPServer.Start;
begin
  //init
  IdTCPServer.Active := False;
  IdTCPServer.Bindings.Clear;

  //Einstellungen
  IdTCPServer.DefaultPort := 60000;

  //Server starten
  IdTCPServer.Active := True;
end;
So jetzt kommt es zu dem Teil der nicht mehr klappt. Es wird eine Exception ausgelöst "Zugriffsverletztung bei Adresse ... in Modul ... Fehler beim Lesen von Adresse ..."
Delphi-Quellcode:
procedure TSvcMain.ServiceDestroy(Sender: TObject) begin
  try
    if DMTCPServer.Started then DMTCPServer.Stop;
  except
    on E: Exception do begin
      //Fehlermeldung
    end;{on}
  end;{try..except}
end;
Die Exception wird schon beim aufruf von TDMTCPServer.Started ausgelöst.

Delphi-Quellcode:
function TDMTCPServer.Started: Boolean;
begin
  result := IdTCPServer.Active;
end;

procedure TDMTCPServer.Stop;
begin
  //Server beenden
  IdTCPServer.Active := False;

  //Verbindungen löschen
  IdTCPServer.Bindings.Clear;
end;
In einer Konsolenanwendung klappt das ganze, ich bekomme dort keine Exception.
Ich verstehe das nicht so ganz, eigentlich müsste das doch funktionieren.

Bummi 26. Sep 2012 12:30

AW: IdTCPServer in Dienstanwendung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Probier mal ob der Anhang läuft ...

Console als Admin

Projekt1 -install
net start TESTSVC

>> browser 127.0.0.1:60000 // kommt nichts zurück
>> Project1.log ansehen

net stop TESTSVC
Projekt1 -uninstall

TUX_der_Pinguin 26. Sep 2012 13:05

AW: IdTCPServer in Dienstanwendung
 
Hi Bummi,

also dein Beispiel Dienst läuft. Der Unterschied zwischen deinem und meinem Dienst liegt darin
das ich den TCP Server "starte" und "beende" im OnCreate und OnDestroy und du im OnStart und OnStop.

Ich bin gerade etwas verwirrt, warum das bei mir nicht klappt.

Zitat:

2012-09-26 13:48:58.179: GET / HTTP/1.1
2012-09-26 13:48:58.194: Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
2012-09-26 13:48:58.210: Accept-Language: de
2012-09-26 13:48:58.225: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
2012-09-26 13:48:58.585: Accept-Encoding: gzip, deflate
2012-09-26 13:48:58.600: Host: 127.0.0.1:60000
2012-09-26 13:48:58.616: Connection: Keep-Alive
2012-09-26 13:48:58.632:
2012-09-26 13:49:12.944: Not Connected

TUX_der_Pinguin 26. Sep 2012 13:44

AW: IdTCPServer in Dienstanwendung
 
So ich habe das ganze jetzt geändert ob das jetzt "Richtig" ist weiß ich nicht.

Im OnCreate des Service wird der TCP Server vorbereitet
Im OnStart des Service wird der TCP Server gestartet (Active := True)
Im OnStop des Service wird der TCP Server beendet (Active := False)

In den Ereignissen OnPause und OnContinue wird der TCP Server ebenfalls beendet bzw.
gestartet.

Wie gesagt ich habe keinen Schimmer ob das alles korrekt ist, aber es funktioniert.

Bummi 26. Sep 2012 13:48

AW: IdTCPServer in Dienstanwendung
 
Hätte ich genauso umgesetzt ...

Sir Rufo 26. Sep 2012 14:11

AW: IdTCPServer in Dienstanwendung
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1184564)
So ich habe das ganze jetzt geändert ob das jetzt "Richtig" ist weiß ich nicht.

Im OnCreate des Service wird der TCP Server vorbereitet
Im OnStart des Service wird der TCP Server gestartet (Active := True)
Im OnStop des Service wird der TCP Server beendet (Active := False)

In den Ereignissen OnPause und OnContinue wird der TCP Server ebenfalls beendet bzw.
gestartet.

Wie gesagt ich habe keinen Schimmer ob das alles korrekt ist, aber es funktioniert.

Kann man zwar so machen und sollte auch keine Probleme ergeben, aber der TCP Server wird auch dann schon vorbereitet, wenn das absolut nicht nötig ist ... und evtl. dadurch sogar zu Fehlern kommen könnte.

Eine Service-Instanz wird auch erzeugt, wenn der Dienst installiert bzw. deinstalliert wird.

Im OnStart die Instanz für den Server erzeugen, vorbereiten und Active auf True
Im OnPause Active auf False (optional)
Im OnContinue Active auf True (optional)
Im OnStop die Instanz für den Server freigeben (FreeAndNil)

TUX_der_Pinguin 26. Sep 2012 14:20

AW: IdTCPServer in Dienstanwendung
 
Zitat:

Zitat von Sir Rufo (Beitrag 1184570)
Eine Service-Instanz wird auch erzeugt, wenn der Dienst installiert bzw. deinstalliert wird.

Das war mir auch schon aufgefallen und habe mich darüber gewundert.

Ich glaube ich bekomme das jetzt hin, mit eurer Hilfe, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 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