AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion FileExists Timeout

Ein Thema von Cyberaxx · begonnen am 11. Jul 2007 · letzter Beitrag vom 11. Jul 2007
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Funktion FileExists Timeout

  Alt 11. Jul 2007, 07:48
Hallo,

habe ein Programm geschrieben, das in einem Netzwerk Rechner anpingt um zu sehen ob sie verfügbar sind.
Mit der zeit ist aber aufgefallen, das die Rechner zwar noch anpingbar waren, aber der Rechner so schon
weg war.
Da einiige Server sind und eine Standardfreigabe haben, überprüfe ich ob eine Datei(C:\Boot.ini)
verfügbar ist.

Delphi-Quellcode:
const
  FILENAMETOCHECK = '\\%s\C$\Boot.ini';

...

  if FileCheck then
    FileOK := FileExists( Format(FILENAMETOCHECK, [HostIP]) )
      else FileOK := True;
Eben ist aufgefallen, das teilweise die Standardfreigabe wieder mal abhanden ist...
Nun rennt der Scanner ständig in Timeouts und benötigt übermäßig lange um das
Result := False; zu bekommen. Gibt es andere Wege nach verfügbarkeit eines Rechners
sprich ob er noch arbeitet herauszufinden. Der ScannerClient ist so eingestellt,
das wenn der Server nach einer bestimmten Zeit mit einem Durchlauf nicht fertig ist
anfängt extrem zu meckern.
Ein Durchgang ergab sich aus Anzahl der zu scannenden Rechner * timeout der Ping Komponente.
Das überprüfen der Datei haut dies natürlich nun aus dem Rahmen...

Weiß hier jemand eine nette Alternative? Würde mich freuen
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 08:03
huhu!

ohne direkt zu wissen was das programm tun soll würde ich folgendes vorschlagen:
wenn du scheinbar zugriff auf die server/rechner hast dann installier doch ein kleines tool welches auf einen udp/tcp broadcast deines "scanners" reagiert.
dein scanner schickt meinetwegen einen broadcast und die clients erhalten die und schicken dir informationen über sich in einem string oder sonstwas an deinen scanner... so weißt du immer wer online ist und wer auch noch gebootet ist...

vielleicht ist das ja ein lösungsweg für dich *shrug* weiß halt nicht genau wo dein tool zum einsatz kommen soll...


gurß
reli
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 08:38
Das Programm pingt kontinuierlich die Rechner an und überprüft ob die Dateifreigabe noch steht.

Entstanden ist das Programm dadurch das wir hier einen Virus im System hatten und sich ständig ein
Server nach dem anderen verabschiedet hat. Um das eben zu merken wurden betreffende Rechner angepingt.

Für den Anfang hat es auch so gereicht nur haben wir dann festgestellt, der Server ist noch per Ping
erreichbar aber die Dateifreigabe läuft nicht mehr. Da die Server(W2K) alle ihre Standardfreigaben haben
C$ <-- z.B. überprüfe ich das eben mit FileExists. Hat bis gestern auch wunderbar geklappt.

Der Server startet sich neu und steht beim Anmeldebildschirm. Daateifreigabe funktioniert noch nicht,
er läuft ins Timeout. Anderer Rechner ist zwar noch anpingbar aber die Dateifreigabe funktioniert
ebenfalls nicht. FileExists läuft ins Timeout. Der Timeout dauerte bei mir Lokal aber schon 15 min.
In der Zeit werden andere Rechner nicht gescannt und der Client meckert natzürlich rum, das der
Server nicht mehr laufen würde.

Ich bräuchte etwas womit ich nen Timeout vorgeben kann oder schon vorgegeben ist. Es ist ja alles im
Netzwerk, sollte also eine möglichst kurze Zugriffszeit alles brauchen.

Wenn ich also auf den Rechnern einen Client drauf habe der TCP/UDB messages abfängt/auswertet, so kann es
vorkommen das er antwortet aber die Freigabe existiert nicht.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#4

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 09:02
Hi,

ich löse ein ähnlich gelagertes Problem mit TDirectoryWatch.
Das löst Ereignisse aus, wenn sich in einem Dir etwas ändert.

Läst sich ja eventuell auf Deine Bedürfnisse anpassen.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 09:32
Habe mir mal die Komponente angesehen, sieht so nicht schlecht aus.

Problem ist ja hier nur, es wird sich ja nichts ändern.

"C:\Boot.ini" wird immer "C:\Boot.ini" heißen, sie wird nicht umbenannt oder geändert.
Der letzte lesezugriff trifft ja auch nicht zu, Die meisten sind Server und bleiben somit eine
ganze Weile Online.

Vllt. könntest Du mir ja sagen, wie lange er braucht um dich zu benachrichtigen, wenn ein Verzeichnis
nicht mehr Erreichbar ist.

Kleines Nebenproblem ist das ich pro Rechner einmal die Komponente bräuchte und diese natürlich nicht
mehr in interaktion mit dem Ping stehen würde.
Im Moment läuft im Hintergrund ein Thread der in einer Schleife jeden rechner anpingt und gleichzeitig
sofern es ein PC ist die Dateifreigabe.

Delphi-Quellcode:
  while not terminated do // Solange kein Terminate gesendet wird fortlaufen
    begin
    // Wert bis zum Timeout warten holen und setzen
    SQLStr := 'SELECT Wert FROM Config WHERE Sub1 = 1 AND Sub2 = 2';
    Qry_GetPK.Active := False;
    Qry_GetPK.SQL.Text := SQLStr;
    Qry_GetPK.Active := True;
    IcmpClient.ReceiveTimeout := DS_GetPK.DataSet.FieldbyName('Wert').AsInteger;

    SQLStr := 'SELECT PK_IP '
      + 'FROM IP '
      + 'WHERE Ueberwachen_Aktiv = 1';

    Qry_GetPK.Active := False;
    Qry_GetPK.SQL.Text := SQLStr;
    Qry_GetPK.Active := True;

    for I := 0 to Qry_GetPK.RecordCount -1 do
      begin
      ID := DS_GetPK.DataSet.FieldbyName('PK_IP').AsString;

      SQLStr := 'SELECT IP, Name, FileCheck, TimeOutCount, '
        + 'Nicht_erreichbar_seit, HideTimeOut, Hidefor '
        + 'FROM IP '
        + 'WHERE PK_IP = %s';

      SQLStr := Format(SQLStr, [ID]);

      Qry_GetPCIPs.Active := False;
      Qry_GetPCIPs.SQL.Text := SQLStr;
      Qry_GetPCIPs.Active := True;

      HostIP := DS_GetPCIPs.DataSet.FieldbyName('IP').AsString;
      Hostname := DS_GetPCIPs.DataSet.FieldbyName('Name').AsString;
      FileCheck := DS_GetPCIPs.DataSet.FieldbyName('FileCheck').AsBoolean;
      TimeOutCount := DS_GetPCIPs.DataSet.FieldbyName('TimeOutCount').AsInteger;
      Nicht_erreichbar_seit := DS_GetPCIPs.DataSet.FieldbyName('Nicht_erreichbar_seit').AsString;
      if Nicht_erreichbar_seit = '01.01.1900then
        Nicht_erreichbar_seit := '';

      IcmpClient.Host := HostIP;
      IcmpClient.Ping(); // Client anpingen

      IPIndex := I;
      Synchronize(DoUpdate);

      if FileCheck then
        FileOK := FileExists( Format(FILENAMETOCHECK, [HostIP]) )
          else FileOK := True;

      if (IcmpClient.ReplyStatus.ReplyStatusType = rsTimeOut) or not FileOK then // Result des Pings auswerten
        begin
// Server Lieferte einen Timeout -----------------------------------------------
        Inc(TimeOutCount);

        Qry_GetPCIPs.Requery(); // Requery, falls Daten geändert wurden und Daten neu Holen fürs TimeOut

        HideTimeOut := DS_GetPCIPs.DataSet.FieldbyName('HideTimeOut').AsBoolean;
        Hidefor := DS_GetPCIPs.DataSet.FieldbyName('Hidefor').AsDateTime;

        if HideTimeOut then
          begin
          if (Hidefor < Now) then
            begin
            HideTimeOut := False;
            HideFor := StrtoDate('01.01.1900');
            end;
          end;

        if (TimeOutCount >= 3) and (Nicht_Erreichbar_seit = '') then
          begin
          // Änderung des Status von Online auf Offline
          ServerStatus(0, ID);

          SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, '
            + 'Letzter_Ping = %s, Nicht_erreichbar_seit = %s, HideTimeOut = %s, Hidefor = %s '
            + 'WHERE PK_IP = %s';

          SQLStr := Format(SQLStr, ['0', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
            '''' + DatetimetoStr(Now) + '''', BooltoStr(HideTimeOut), '''' + DateTimetoStr(Hidefor) + '''', ID]);
          end
            else begin
            SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, Letzter_Ping = %s, HideTimeOut = %s, Hidefor = %s '
              + 'WHERE PK_IP = %s';

            SQLStr := Format(SQLStr, ['0', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
              BooltoStr(HideTimeOut), '''' + DateTimetoStr(Hidefor) + '''', ID]);
            end;

        end
// Server lieferte keinen Timeout ----------------------------------------------
          else begin
          TimeOutCount := 0;

          if (Nicht_erreichbar_seit <> '') then
            begin
            // Änderung von Offline auf Online
            ServerStatus(1, ID);

            SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, '
              + 'Letzter_Ping = %s, Nicht_erreichbar_seit = %s, HideTimeOut = 0, Hidefor = %s '
              + 'WHERE PK_IP = %s';

            SQLStr := Format(SQLStr, ['1', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
              '''' + '' + '''', '''' + '' + '''', ID]);
            end
              else begin
              SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, Letzter_Ping = %s, '
                + 'HideTimeOut = 0, Hidefor = %s WHERE PK_IP = %s';

              SQLStr := Format(SQLStr, ['1', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''', '''' + '' + '''', ID]);
              end;

          TimeOutCount := 0;
          end;

      Qry_Set.Active := False;
      Qry_Set.SQL.Text := SQLStr;
      Qry_Set.ExecSQL;

      Qry_GetPK.Next;
      end;

    Synchronize(DoFinish);

    Sleep(100);

    RunComplete;
    end;
die beiden Synchchronizes sind nur für die Visuelle Darstellung am Server.
Anzeige des Servers der gescannt wird.
Anstoss zum aktualisieren des Grids.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#6

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 10:18
Zitat:
Vllt. könntest Du mir ja sagen, wie lange er braucht um dich zu benachrichtigen, wenn ein Verzeichnis nicht mehr Erreichbar ist.
Sofort.

Einziger Haken: er will einen Laufwerksbuchstaben, Du müsstest es also auf Deine Bedürfnisse anpassen.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 17:00
Ich werde mir das mal zu gemüte führen und mal schauen was ich damit anstellen kann.

Wie gesagt ich hatte teilweise durch Windows erst nach 15 Minuten einen Fehlerdialog und das dann im extremfall bei 20 Rechnern,
das wird übel.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 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