![]() |
Dienste abfragen!
Sorry wenn das jetzt ne absolute Noob-Frage seien sollte!
Es geht sich um folgendes. Ich will abfragen ob ein bestimmter Dienst mit einem bestimmten Socket bereits gestartet ist. In meinem speziellen Fall ist es WinStone (ein Java Servlet Container). Ich hab mir das so vorgestellt:
Delphi-Quellcode:
Nur kommt jedesmal eine Fehlermeldung "Asynchroner Socket Fehler xyz". Der Fehlercode variiert ;)
function isStarted: Boolean;
var socket: TClientSocket; begin socket.Create; socket.Host := '127.0.0.1'; socket.Port := 4051; socket.Open; Result := socket.Active; end; Ich hoffe mal ich hab da irgendwie keinen Denkfehler drin oder so. Oder vielleicht gehts ja auch viel einfacher. |
Re: Dienste abfragen!
Du könntest mit
Delphi-Quellcode:
den Fehler abfangen ...
try
socket.Open; result := true; except result := false; showmessage('Service schon aktiv'); end; Florian |
Re: Dienste abfragen!
Hallo Doktor,
hast du den code, den du postest wirklich getestet?
Delphi-Quellcode:
da meckert doch der Compiler?
socket.Create;
Deine Funktion wird im Allgemeinen immer false zurückgeben, da bei Beendigung der .open Methode die Eigenschaft .active noch false ist. Da musst du abwarten ob onconnect oder onerror eintritt. Erst dann hast du Information, die du brauchst. Aus dem selben Grund gibt die vorgeschlagene Variante mit try except immt true zurück, da bei Beendigung der .open Methode noch keine Exception aufgetreten ist, auch wenn sich später herausstellen sollte, dass die Vebindung nicht zustande kommt. Da wurde etwas vorgeschlagen dass nicht getestet wurde. Beim Testen hätte sich herausgestellt, dass es so nicht funktioniert.
Delphi-Quellcode:
Etwas eleganter wäre natürlich eine Variante ohne Warteschleife. Sie ist auch nicht nötig.
procedure tform1.connect(Sender: TObject;
Socket: TCustomWinSocket); begin (sender as tclientsocket).tag:=0; end; procedure tform1.sockerr(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin form1.memo1.lines.add(inttostr(errorcode)); (sender as tclientsocket).tag:=errorcode; errorcode:=0; end; function test():boolean; var socket: TClientSocket; begin // socket.Create; // Compilerfehler <--<<< // socket.create(form1); // EAccessViolation <--<<< socket:=tclientsocket.Create(form1); // works <--<<< socket.OnError:=form1.sockerr; socket.OnConnect:=form1.connect; socket.Host := '127.0.0.1'; socket.Port := 4051; socket.Tag := -1; socket.Open; while (socket.tag = -1) do begin form1.memo1.lines.add('looping'); application.ProcessMessages; sleep(100); end; if socket.tag=0 then result:=true else result:= false; socket.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin if test() then memo1.lines.add('* active *') else memo1.Lines.add('* not active *'); end; Um ohne Warteschleife aus zu kommen, verlegt man die Reaktionen auf das Zustandekommen der Verbindung in die onconnect Prozedur und die Reaktionen auf das Fehlschlagen in die onerror Prozedur. grüsse, der flossinger |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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