AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi 100 Server parallel überprüfen, ob Sie online sind?
Thema durchsuchen
Ansicht
Themen-Optionen

100 Server parallel überprüfen, ob Sie online sind?

Ein Thema von Piro · begonnen am 12. Mai 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

100 Server parallel überprüfen, ob Sie online sind?

  Alt 12. Mai 2010, 23:13
Guten Abend,

ich würde gerne ein Überwachungsprogramm schreiben, welches den Status von 100 Server überprüft (Online oder Offline).

Meine Idee wäre mit Hilfe einer Ping Unit und Multithreads. Hier ist mein Problem, dass ich keine Multithreads programmieren kann bzw. nicht weiß, wie man das umsetzt.

Gibt es eventuell noch eine andere Mäglichkeit (leichter)? Eventuell eine Server/Client Geschichte?

Die Überprüfung wird nur von einem Rechner ausgeführt. Die Server sollen den Status nicht senden.

Bitte lasst mich an euren Erfahrungen oder Lösungen teilhaben.

Vielen Dank im voraus.

Sven
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 12. Mai 2010, 23:25
Sowas gibts schon fertig, gut und kostenlos, z.B. Zabbix
Das wäre wohl die leichteste Variante. Basiert auf Client/Server und ein Rechner kann alles überprüfen.
Das geht auch über das "Online sein" hinaus, du kannst auch z.B. den Status einzelner Dienste prüfen und vieles mehr.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#3

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 12. Mai 2010, 23:25
Na dann lernst du halt wie man Multithreading benutzt. So schwer ist das sicher nicht! Ich glaube, dass Luckie mal ein Programm schrieb, welches alle IPs in einem Subnetz anpingte. Vielleicht hilft dir das, wenn du dir das mal anschaust?

Eine sinnvollere Lösung - falls du Zugriff auf die Server hast - wäre übrigens Broadcast. Unter Linux:

Code:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Und in der Datei /etc/sysctl.conf den Wert net.ipv4.icmp_echo_ignore_broadcasts auf 0 gesetzt und schon hätte man was effizienteres. Der Server sendet einen Broadcast-Ping an alle (z.B. "ping -b 10.255.255.255") und wertet die Antworten aus. Andere Möglichkeit wäre noch Multicast. Was effizienteres fällt mir i.M. nicht ein.

Liebe Grüße,
Valle
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#4

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 12. Mai 2010, 23:31
Die Software sieht interessant aus aber ich würde es gerne selber machen. Soll heißen selber programmieren. Die Überwachungssoftware ist schon programmiert. Jetzt muss nur noch der Automatismus für die Serverüberprüfung implementiert werden.

Ich schaue mir mal das Programm von Luckie an. Ich glaube, ich werde in Richtung Multithreads gehen.

Kennt einer gute Lernbeispiele außer das von Luckie
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#5

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 12. Mai 2010, 23:42
Hm. Ein Beispiel kenne ich jetzt nicht, aber das müsste schon helfen.
Im Grunde ist es ganz einfach. Du leitest dir eine eigene Klasse von TThread ab und überschreibst dabei die Execute-Methode. In dieser wird dein eigener Code ausgeführt, dort kannst du dann z.B. den Ping absetzen. Erstellen tust du den Thread dann z.B. so:

Delphi-Quellcode:
var
  T: TMeinThread;
begin
  T := TMeinThread.Create(True); //Thread angehalten erstellen
  T.FreeOnTerminate := True; //Freigeben wenn Execute-Methode fertig
  T.Resume; //Thread starten
end;
Was meiner Meinung nach manchmal etwas nervig, kompliziert oder fehleranfällig ist, ist das Weiterleiten von Informationen des Threads an den Main-Thread, bzw. VCL-Sachen/Fenster. Behalte dabei immer im Hinterkopf, dass du aus der Execute-Methode, bzw. Methoden, die von Execute aus aufgerufen werden, nichts mit der VCL machen darfst. D.h. wenn dein Thread beispielsweise den Text eines Labels ändern will oder in ein TListView ein TListItem hinzufügen möchte, muss das über die Synchronize()-Methode des Threads oder andere Mechanismen wie SendMessage oder PostMessage passieren. Das gilt auch für hässliche globale/gemeinsame Variablen, sofern die benutzt werden - der Zugriff darauf sollte immer nur von einem Thread aus gleichzeitig erfolgen, also eventuell noch über CriticalSections informieren, das könnte auch hilfreich sein.

Viel Erfolg
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 13. Mai 2010, 02:04
Wenn du mal Threads drauf hast, dann würde ich das ganze wie folgt machen:
  • Erzeuge n Threads, die jeweils m Server nacheinander überprüfen. Natürlich kannst du hier für jeden Server einen Thread erzeugen.
  • Ping innerhalb eines Thread m Server nacheinander an und schicke via SendMessage eine Nachricht an den HauptThread/Klasse (in so fern du eine normale Klasse ohne Handle hast, musst du darin eines via AllocateHWnd erzeugen (DeallocateHWnd nicht vergessen!))
  • Anfänglich kannst du ja ein Array mit n*m Einträge, d.h. für jeden Server einen Eintrag. Drei Werte würde ich einem Server-Status geben: ungeprüft, nicht verfügbar und verfügbar.
  • Via SendMessage kannst du dem MainThread ja die Nachricht zukommen lassen, ob ein Server verfügbar ist oder nicht und feuerst automatisch ein Event, sodass auf eine Änderung eines Status reagiert werden kann.

Hier mal ein wenig Code, frei Hand; sollten also Fehler auftreten, dann garantiere ich für nix

Delphi-Quellcode:
uses
  Classes // hier ist die TThread-Klasse drin
  SysUtils;

const
  WM_SERVER_STATUS = WM_USER + 2;


type

TServerStatus = (ssUnknown, ssOkay, ssUnreachable);

PServerStatusResponse = ^ServerStatusResponse;
RServerStatusResponse = record
  Address : String;
  Status : TServerStatus;
end;

type
TServerCheckThread = class(TThread)
private
  FWatcherHandle : HWND;
  FServerAddress : String;
protected
  procedure Execute(); override;
public
  property WatcherHandle : HWND read FWatcherHandle write FWatcherHandle;
  property ServerAddress : String read FServerAddress write FServerAddress;
end;

procedure TServerCheckThread.Execute();
var
  sr : PServerStatusResponse;
begin
  while (not Terminated) do
  begin
    //
    // Ping ServerAddress...
    //

    New(sr);
    sr^.Address := Self.ServerAddress
    sr^.Status := ... ; // set server status after ping
    SendMessage(FWatcherHandle, WM_SERVER_STATUS, Integer(sr), 0);

    // sleep 10 sec. between two checks...
    SleepEx(10000, True);
  end;
end;

{ ... }

type
TServerWatcher = class(TObject)
private
  FHandle : HWND;
  FWatcherThreads : TList;
  FServerStatus : TStringList;
  procedure WndProc(var Msg:TMessage);
  procedure OnServerStatus(var Msg: TMessage); message WM_SERVER_STATUS;
public
  property Handle : HWND read FHandle;
  constructor Create(); reintroduce;
  destructor Destroy(); override;
  procedure StartWatcherThread(const AServerAddress: String);
end;

procedure TServerWatcher.WndProc(var Msg: TMessage);
begin
  Dispatch(Msg);
end;

procedure TServerWatcher.OnServerStatus(var Msg: TMessage);
var
  sr : PServerStatusResponse
begin
  sr := PServerStatusResponse(msg.WParam);
  try
    FServerStatus.Values[sr^.Address] := ... ; // cast sr^.Status to a good format
  finally
    // free memory (important!)
    Dispose(sr);
  end;
end;

constructor TServerWatcher.Create();
begin
  inherited Create();

  // allocate handle
  FHandle := AllocateHWnd(WndProc);

  // create thread list
  FWachterThreads := TList.Create();

  // create server status list
  FServerStatus := TStringList.Create();
end;

destructor TServerWatcher.Destroy();
var
  i : Integer;
  wt : TWatcherThread;
begin
  // free threads and thread-container
  for i := FWachterThreads.Count - 1 downto 0 do
  begin
    wt := FWachterThreads[i];
    wt.Terminate();
    WaitForSingleObject(FStartupThread.Handle, 1000);
    FreeAndNil(wt);
  end;
  FreeAndNil(FWachterThreads);

  // free server-status list
  FreeAndNil(FServerStatus);

  // free handle
  DeallocateHWnd(FHandle);

  inherited Destroy();
end;

procedure TServerWatcher.StartWatcherThread(const AServerAddress: String);
var
  wt : TWatcherThread;
begin
  // create status for server in list
  FServerStatus.Add(AServerAddress + '=' + ... ); // cast ssUnknown to a good format

  // create sleeping watcher-thread
  wt := TWatcherThread.Create(True);
  wt.WatcherHandle := FHandle;
  wt.ServerAddress := AServerAddress;
  FThreadList.Add(wt);
  wt.Start();
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#7

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 13. Mai 2010, 10:13
Vielen Dank. Das ist ja eine Menge Quellcode, den ich erstmal verstehen muss. Aber sehr genial.

Schönen Vatertag.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#8

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 13. Mai 2010, 11:32
Sind da Threads überhaupt notwendig? 100 Server ist nicht so die Menge. Du könntest doch in einem Thread die 100 ICMP-Pakete losschicken und dann einfach nur die Antwortpackete auswerten.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 14. Mai 2010, 07:34
Zitat von Nikolas:
Sind da Threads überhaupt notwendig? 100 Server ist nicht so die Menge. Du könntest doch in einem Thread die 100 ICMP-Pakete losschicken und dann einfach nur die Antwortpackete auswerten.
Wenn er halt mehr machen willst, dann ists schon ganz praktisch. Zudem kann man sein Wissen dadurch etwas erweitern
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.194 Beiträge
 
Delphi 2007 Architect
 
#10

Re: 100 Server parallel überprüfen, ob Sie online sind?

  Alt 19. Mai 2010, 12:51
Zitat von daywalker299:
Guten Abend,

ich würde gerne ein Überwachungsprogramm schreiben, welches den Status von 100 Server überprüft (Online oder Offline).
Ich würde es mit fastping machen. Das habe ich auch hier auf meinem router laufen. Der schau alle 5 minuten das komplette segment (254 ips) durch, wer an bzw. aus ist. Das ganze drauert 7 sekunden ( grade gemessen )

Gruss
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  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 14:08 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