Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TServerSocket Events werden nicht ausgeführt (https://www.delphipraxis.net/34569-tserversocket-events-werden-nicht-ausgefuehrt.html)

manuel 24. Nov 2004 20:54


TServerSocket Events werden nicht ausgeführt
 
Hi Leute,

ich schreibe einen Windows-Service der nach einer eingehenden TCP-Verbindung Daten aus einer Datenbank holt und zurück zum Client sendet.

Und da liegt das Problem:
Der Client kann zwar verbinden, aber die TServerSocket Eventroutinen scheinen nicht aufgerufen zu werden :?

Noch ein paar Details:
Das Programm lief vorher als normales Anwender-Programm einwandfrei, dann habe ich versucht es in einen Service (threaded) zu konvertieren.

Der Serice erstellt einen Thread, welcher sich um die eigentliche Aufgabenbearbeitung kümmert.
Hier mal der Code für den Thread:


Delphi-Quellcode:
unit NTServiceThread;

interface

uses
  Windows, Messages, SysUtils, Classes,CheckSum, Help, AMC_Registry, Db, ZMySqlQuery,
  ZQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon, Log,ScktComp,Forms, Dialogs;


      type
  CustomRec = record
    StartTag: integer;
    MSG_1: String[255];
    MSG_2: String[255];
    CheckSum: Integer;
    EndTag: integer;
end;
   
type
  TNTServiceThread = Class(TThread)
  private
    { Private declarations } 
  Public
    { Public declarations } 
    Interval             : Integer;
    SrvSock: TServerSocket;  // der Server-Socket
    serverthread:TServerClientThread ;
    ReceiveRec: CustomRec ;
    SendRec : CustomRec  ;
    Error_Counter:Integer;
    cstemp:String; //nimmt Einmal-Code auf
    help:THelp;
    logfile:TLog;
    registry: AMCRegistry;

    procedure Listening(Sender: TObject; Socket: TCustomWinSocket);
    procedure Connecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure DisConnecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure Reading(Sender: TObject; Socket: TCustomWinSocket);
    procedure IsError(Sender: TObject; Socket: TCustomWinSocket;
                     ErrorEvent: TErrorEvent; var ErrorCode: Integer);



    Procedure Execute; Override;
  Published
    { Published declarations } 
  End;

implementation

{ TNTServiceThread }
uses unit1;

procedure TNTServiceThread.Execute;
Var
   TimeOut     : Integer;
begin
     { Do NOT free on termination - The Serivce frees the Thread } 
     FreeOnTerminate := False;

     { Set Interval } 
     TimeOut := Interval * 4;



help:=Thelp.Create;
registry:=AMCregistry.Create;
logfile:=TLog.create(true);
logfile.OpenLogFile;

 SrvSock:=TServerSocket.Create(unit1.DaVe_Licencing.Owner);
 logfile.WriteEntry('Create TServerSocket');
 SrvSock.Port:=registry.getPort;
 logfile.WriteEntry('Get Port');

 SrvSock.ServerType:=stNonBlocking;
 logfile.WriteEntry('Servertype stNonBlocking');
 SrvSock.OnListen:=Listening;
 SrvSock.OnClientConnect:=Connecting;
 SrvSock.OnClientDisConnect:=DisConnecting;
 SrvSock.OnClientRead:=Reading;
 SrvSock.Open;
 logfile.WriteEntry('ServSock.Open');
 registry.Free;
 beep;


     { Main Loop } 
     Try
        While Not Terminated do
        Begin
             { Decrement timeout } 
             Dec( TimeOut );

             If (TimeOut=0) then
             Begin
                  { Reset timer } 
                  TimeOut := Interval * 4;

                  { DoWork }








             End;
             { Wait 1/4th of a second } 
             Sleep(250);
        End;
     Except
        On E:Exception do ; // TODO: Exception logging...
     End;
     { Terminate the Thread - This signals Terminated=True }
     logfile.CloseLogFile;
     Terminate;
end;



procedure TNTServiceThread.IsError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 Socket.Close;
 logfile.WriteEntry('Event: IsError - Socket.close');
 ErrorCode:=0;
end;

procedure TNTServiceThread.DisConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin

        logfile.WriteEntry('DisConnected: ' + Socket.RemoteHost+' '+Socket.RemoteAddress);
        beep;
end;


procedure TNTServiceThread.Connecting(Sender: TObject; Socket: TCustomWinSocket);


begin

 Socket.OnErrorEvent:=IsError;
 //Memo1.Lines.add('Connected to ' + Socket.RemoteHost+' '+Socket.RemoteAddress);
 logfile.WriteEntry('Connected to ' + Socket.RemoteHost+' '+Socket.RemoteAddress);
  beep;
end;

procedure TNTServiceThread.Listening(Sender: TObject; Socket: TCustomWinSocket);
begin

      // TODO
end;


procedure TNTServiceThread.Reading(Sender: TObject; Socket: TCustomWinSocket);
var Licence:String;
begin
showMessage('#Incoming');
Socket.ReceiveBuf (ReceiveRec,sizeof(ReceiveRec));
logfile.WriteEntry(ReceiveRec.MSG_1);
end;

end.

Gibt es eigentlich eine Sinnvolle Möglichkeit (ausser loggen in txt-files) Services zu debuggen?


Gruß

Manuel

manuel 26. Nov 2004 11:35

Re: TServerSocket Events werden nicht ausgeführt
 
Hat denn keiner ne Idee?

:( :cry: :(

Muetze1 26. Nov 2004 18:01

Re: TServerSocket Events werden nicht ausgeführt
 
Moin!

Ich verstehe nicht ganz, warum du das ganze threaded machen musst, da schliesslich der TServerSocket intern schon threaded arbeitet und du somit ein Thread im Thread bedienst was dann ja wiederrum höher Ansprüche an das synchronisieren und verteilen legt. Daher meine Idee dazu: Nimm den Thread im Service raus und mach es direkt.

MfG
Muetze1

manuel 26. Nov 2004 22:00

Re: TServerSocket Events werden nicht ausgeführt
 
Hab ich mir auch schon überlegt.
Aber ich hab auf verschiedenen Seiten gelesen, man sollte es so machen, da es besser für die verwaltung der Dienste wäre.

Aber ich werds wohl rausnehmen, wenn ich den Fehler net finde...

Gruß

Manuel

Sprint 26. Nov 2004 22:13

Re: TServerSocket Events werden nicht ausgeführt
 
Zitat:

Zitat von manuel
Gibt es eigentlich eine Sinnvolle Möglichkeit (ausser loggen in txt-files) Services zu debuggen?

Als normale Anwendung schreiben. Wenn's dann BugFrei ist zum Dienst umschreiben.

manuel 26. Nov 2004 23:41

Re: TServerSocket Events werden nicht ausgeführt
 
Zitat:

Als normale Anwendung schreiben. Wenn's dann BugFrei ist zum Dienst umschreiben.
Hab ich gemacht....
Hatte allerdings Probleme mit dem Beenden des Services und wusste nicht wieso...
Hatte
Code:
ServiceThread.ProcessRequests( False );
vergessen :wall:

Gruß

Manuel


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