Einzelnen Beitrag anzeigen

Supergr

Registriert seit: 8. Feb 2012
12 Beiträge
 
#1

Indy UDP Server als Dienst

  Alt 7. Mai 2021, 10:18
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
  Mit Zitat antworten Zitat