![]() |
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 |
Re: TServerSocket Events werden nicht ausgeführt
Hat denn keiner ne Idee?
:( :cry: :( |
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 |
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 |
Re: TServerSocket Events werden nicht ausgeführt
Zitat:
|
Re: TServerSocket Events werden nicht ausgeführt
Zitat:
Hatte allerdings Probleme mit dem Beenden des Services und wusste nicht wieso... Hatte
Code:
vergessen :wall:
ServiceThread.ProcessRequests( False );
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