Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dienste abfragen! (https://www.delphipraxis.net/78837-dienste-abfragen.html)

Doktor Ruff 11. Okt 2006 20:59


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:
function isStarted: Boolean;
var
  socket: TClientSocket;
begin
  socket.Create;
  socket.Host := '127.0.0.1';
  socket.Port := 4051;
  socket.Open;
  Result := socket.Active;
end;
Nur kommt jedesmal eine Fehlermeldung "Asynchroner Socket Fehler xyz". Der Fehlercode variiert ;)

Ich hoffe mal ich hab da irgendwie keinen Denkfehler drin oder so. Oder vielleicht gehts ja auch viel einfacher.

Zacherl 11. Okt 2006 22:08

Re: Dienste abfragen!
 
Du könntest mit
Delphi-Quellcode:
try
  socket.Open;
  result := true;
except
  result := false;
  showmessage('Service schon aktiv');
end;
den Fehler abfangen ...

Florian

flossinger 13. Okt 2006 13:24

Re: Dienste abfragen!
 
Hallo Doktor,

hast du den code, den du postest wirklich getestet?

Delphi-Quellcode:
  socket.Create;
da meckert doch der Compiler?

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:
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;
Etwas eleganter wäre natürlich eine Variante ohne Warteschleife. Sie ist auch nicht nötig.

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 23:19 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