Entwickler-Ecke

Internet / Netzwerk - Probleme mit ICMP


Faithless - Di 24.01.06 20:04
Titel: Probleme mit ICMP
Hallo Leute!

Ich versuche ein einfaches Programm zu schreiben, das mittels ping 2 ips auf ihre erreichbarkeit prüft, und wenn beide nicht mehr erreichbar sind, dann soll ehr den pc mittel shellexecute runterfahren!

Aber wie zum teufel mach ich das? ich werd wahnsinnig! Hab schon alles probiert! Aber er gibt mir keine meldung, wenn die ip nicht erreich bar ist, wenn der ping durchgeht ist alles wunderbar aber wenn er nicht durchgehn, dann macht der grad mal garnichts, nicht mal das was in der if-anweisung steht! Wäre nett wenn mir jemand helfen könnten! Hier ist erstmal der Code! Danke schonma im vorraus!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, icmp, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    mem_out: TMemo;
    Box1: TPing;
    Box2: TPing;
    Edit2: TEdit;
    TimerPing: TTimer;
    Button2: TButton;
    TimerCheck: TTimer;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Box1Ping(sender: TObject; status, ip, roundtime: Integer);
    procedure TimerPingTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure TimerCheckTimer(Sender: TObject);
    procedure Box2PingPing(sender: TObject; status, ip,
      roundtime: Integer);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Sucessbox1,Sucessbox2 :Integer ;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Box1.Hostname := edit1.Text;
Box2.Hostname := edit2.Text;
end;

procedure TForm1.Box1Ping(sender: TObject; status, ip, roundtime: Integer);
  begin
 case status of
    ip_success:
    if (status = 0then sucessbox1:=1 else sucessbox1:=0;


end;
end;

procedure TForm1.TimerPingTimer(Sender: TObject);
begin
Box1.action;
Box2.action;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Sucessbox1 := 1;
Sucessbox2 := 1;
button1.Caption :='Übernehmen';
button2.Caption :='Starten'   ;
button3.Caption :='Ping ende';
TimerPing.Enabled := False;
TimerCheck.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TimerPing.Enabled := True;
TimerCheck.Enabled := True;
end;

procedure TForm1.TimerCheckTimer(Sender: TObject);
begin
 if (sucessbox1 + sucessbox2 = 2then mem_out.Lines.Add('OK'else mem_out.Lines.Add('Es wird runtergefahren')

end;

procedure TForm1.Box2PingPing(sender: TObject; status, ip,
  roundtime: Integer);
begin
    case status of
    ip_success:
    if (status = 0then sucessbox2:=1 else sucessbox2:=0;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Box1.Terminate;
Box2.Terminate;
TimerPing.Enabled:=False;
TimerCheck.Enabled:=False;
end;

end.


Chryzler - Di 24.01.06 20:15

Das gleiche Problem hatte ich auch einmal, kann dir aber nicht weiterhelfen. Bei der TPing Kombo müsste ein Beispiel dabei sein, könntest du dir vielleicht mal anschauen, ich hab den Code leider nicht mehr.


UGrohne - Di 24.01.06 20:19


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Box2PingPing(sender: TObject; status, ip,
  roundtime: Integer);
begin
    case status of
    ip_success:
    if (status = 0then sucessbox2:=1 else sucessbox2:=0;
end;

Wieso ueberpruefst Du hier zweimal den Wert von Status? Und ich verstehe auch ueberhaupt nicht, was jetzt der Status 1 und Status 0 bedeuten soll. Nimm das case mal raus und probiers so.

Achja, die Klasse TPing sagt mir uebrigens nix ;)


Faithless - Di 24.01.06 20:30

Hatte das case auch schon draussen dann geht es auch nicht!

Also ich hatte das so gedacht!
Ich mahc mir zwei variablen Sucessbox1 und Sucessbox2 und wenn der ping dann erflogreich war setzt ich die varialb für die jeweilige ip auf null oder 1 um dann nachher unten zu vergleichn und ggf. den rechner herunter zu fahren!

BSP
Rechner 1 wird gepingt.
Ping ist ok Sucessbox1 := 1;

Rechner 2 wird gepingt
Ping ist ok Sucessbox2 := 1;


Dann der vergleich
If sucessbox1>0 and sucessbox2>0 then schowmessage('ping ok ')

so in der art ich hoffe ihr habts verstanden!
Der rechner soll aber nur runter fahren, wenn beide ips nicht mehr erreichbar sind


Narses - Mi 25.01.06 00:32

Moin!

Ich mach mal Werbung für meine Ping-Unit [http://www.delphi-forum.de/topic_ICMPEchoAPI+quotPingquot+WrapperUnit_53259.html] 8); schau dir mal das Beispiel-Prog an, dein Problem sollte sich wie dort beschrieben sehr leicht lösen lassen. :wink: Kannste direkt mit einer if-Abfrage erledigen.

cu
Narses