Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy UDP Server als Dienst (https://www.delphipraxis.net/207827-indy-udp-server-als-dienst.html)

Supergr 7. Mai 2021 09:18

Indy UDP Server als Dienst
 
Hallo Zusammen,

ich versuche mich aktuell leider vergeblich an einem Indy UDPServer als Dienst.
Die Dienst Struktur und der Dienst selber laufen.

Leider empfängt der Server nichts.
Wen ich den gleichen Code in einem Programm starte gehts einwandfrei.

Leider finde ich kaum info über die Dienstumgebund die dafür vorgesehen werden muss damit der Dienst auch Zugriff auf das Netzwerk bekommt.

Hier erst mal der Dienst an sich:

Code:
var
  STARITZzeit: TSTARITZzeit;
  Log : TStreamWriter;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  STARITZzeit.Controller(CtrlCode);
end;

function TSTARITZzeit.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TSTARITZzeit.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
   Continued := True;
end;

procedure TSTARITZzeit.ServiceStart(Sender: TService; var Started: Boolean);
begin
   Log := TStreamWriter.Create(TFileStream.Create('c:\log\staritz.log', fmCreate or fmShareDenyWrite));
   started := ConnectServices(log, Zeit_UDP);
end;

procedure TSTARITZzeit.Zeit_UDPUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
   Log.WriteLine('UDP Recive!');
   sec_Zeit_UDPUDPRead(Zeit_UDP, XMLZeit, XMLSend, AThread, AData, ABinding);
end;

end.
Der UDP Server liegt auf der Mainform und wird nach "unten" durchgereicht.
Hier der Code der Unit:

Code:
var adsC : TAdsConnection;
    adsM : TAdsTable;
    adsT : TAdsTable;

function ConnectServices(log: TStreamWriter; Zeit_UDP: TIdUDPServer): Boolean;
begin
   result := FALSE;
   ... öffne ein paar Datenbänke...

   // Einmal testen ob der ADS läuft...
   try
      ADSC.IsConnected := TRUE;
   except
      Log.WriteLine('Dictionary conect failed!');
      exit;
   end;
   // Datenbänke testen
   try
      AdsM.Active := TRUE;
   except
      Log.WriteLine('Database Mitar conect failed!');
      exit;
   end;
   try
      AdsT.Active := TRUE;
   except
      Log.WriteLine('Database TimeTable conect failed!');
      exit;
   end;
   // Testen ob der UDP-Port geht...
   try
      Zeit_UDP.ThreadedEvent := TRUE;
      Zeit_UDP.Active := TRUE;
   Except
      Log.WriteLine('UDP conect failed!');
      exit;
   end;
   ADSC.IsConnected := FALSE;
   Log.WriteLine('Staritz aktiv!');
   result := TRUE;
end;

procedure sec_Zeit_UDPUDPRead(Zeit_UDP: TIdUDPServer; XMLZeit: TJvSimpleXML; XMLSend: TJvSimpleXML; AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var i : integer;
    sData, sRFID : String;
    rGoOut, rGoIn, rNotFound : Boolean;
    tempElement : TJvSimpleXMLElem;
begin
// Code Empfang und auflösen
    for i:= 0 to length(AData)-1 do
        sData := sData + chr(AData[i]);

    XMLZeit.LoadFromString(sData);
    try
       ...
Ich schreibe mir in einem Log weg was intern passiert.
Dienst kommt bis zum "Staritz aktiv!"
Das heißt der UDP Server arbeitet.
Ports usw. habe ich natürlich schon getestet.

Aber egal wie ich ihn installiere kommt nichts an.

Hat jemand eine Idee?

Threadevent ist im Server auf TRUE!

Gelesen hatte ich schon das deswegen KEINE weiter OnExecute im Dienst benötigt wird.

Für jede Idee wäre ich dankbar!

WIN 10 - Delphi XE7

Danke

himitsu 7. Mai 2021 10:05

AW: Indy UDP Server als Dienst
 
Mit einem TCP-Server haben wir / hat niemand in einem Dienst grundsätzlich keine Probleme.


UDP weiß ich nicht, aber ich wüsste keinen Grund, warum es da anders sein sollte.


[edit]
Stimmt, die Firewall muß es natürlich auch erlauben.

Supergr 7. Mai 2021 10:51

AW: Indy UDP Server als Dienst
 
Danke,

bin alles nochmal durchgegangen! Habe es gefunden :roll:

Das Programm mit dem Server und der Unit lief ja ohne Probleme.
Der Dienst nicht.

Windows DomänenFirewall aus, dann geht auch der Dienst!

Warum Windows auf ein und der selben Maschine zwischen Programm und Dienst einen Unterschied macht
erschließt sich mir "noch" nicht... Aber gut!

Fehler ist gefunden!

VG
Stevie

TiGü 7. Mai 2021 11:01

AW: Indy UDP Server als Dienst
 
Systemsteuerung\Alle Systemsteuerungselemente\Windows Defender Firewall\Zugelassene Apps

Da deine Applikation hinzufügen, schon werden alle Ports für TCP und UPD durchgelassen.


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