Synapse PingSend result

Rund um die LCL und andere Komponenten
Antworten
siro
Beiträge: 794
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Synapse PingSend result

Beitrag von siro »

Hallo zusammen,

ich probiere grad meine Messgeräte über LAN SCPI zu steuern.
Jetzt wollte ich erstmal die Adresse pingen um zu sehen ob das Gerät reagiert.
Dazu gibt es in Synapse die Unit PingSend

Das funktioniert auch super. Aber als ich eine nicht vorhandene IP angepingt habe, bekam ich trotzdem TRUE von PingSend zurück ?
Nach etwas rumsuchen, stellte ich fest, das mir aber eine "andere" Adresse zurück geliefert wurde als ich gesendet habe.

Das ist dann immer meine IP von meinem Winodws PC ? habe ich herausgefunden
Ich weis nicht ob das so gewollt ist, aber anhand dieser Feststellung kann man das natürlich auch berücksichtigen.

Ich habe 192.168.178.22 gesendet (mein Messgerät) und zurück kam 192.168.178.26
Wenn ich mein Messgerät ausgeschaltet habe, dann liefert PingSend auch FALSE.

Ob das Verhalten normal ist, weis ich nicht, aber evtl. könnt Ihr etwas dazu sagen.
Ich hab das nur auf einem Windows PC getestet.

Dazu mal mein Programmcode.

Code: Alles auswählen

procedure TForm1.ButtonPingClick(Sender: TObject);
var
  Ping: TPINGSend;
  ip:string;
begin
  ip:=EditIp.Text;

  Ping := TPINGSend.Create;
  try
    if Ping.Ping(ip) then
    begin
      if SameText(Ping.ReplyFrom, ip) then  // !!! Problem gelöst: nur wenn gesendete und empfangeene IP identisch sind.
      begin
        ListBox1.Items.Add('Ping OK');
        ListBox1.Items.Add('Antwort von: ' + Ping.ReplyFrom);
        ListBox1.Items.Add('Zeit: ' + IntToStr(Ping.PingTime) + ' ms');
      end
      else
      begin
        ListBox1.Items.Add('Ziel nicht erreichbar');
        ListBox1.Items.Add('Antwort von: ' + Ping.ReplyFrom);
        ListBox1.Items.Add('Fehler: ' + Ping.ReplyErrorDesc);
      end;
    end
    else
    begin
      ListBox1.Items.Add('Ping fehlgeschlagen');
      ListBox1.Items.Add('Fehler: ' + Ping.ReplyErrorDesc);
    end;
  finally
    Ping.Free;
  end;  // end vom try

end; // end procedure
Hier das Testprojekt:
project1.zip
(95.53 KiB) 9-mal heruntergeladen
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

shokwave
Beiträge: 492
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie/macOS (Laz 4.x FPC 3.2.x)
CPU-Target: i386, x64, arm64
Wohnort: Gera

Re: Synapse PingSend result

Beitrag von shokwave »

Da bin ich auch schon drüber gestolpert.
Du kannst auch auf

Code: Alles auswählen

Ping.ReplyError = IE_NoError
prüfen., wenn du wissen möchtest, ob eine Antwort, von der Zieladresse kam.

Edit: Link zu meinem "MultiPing" https://github.com/shokwave0815/MultiPing
Das hatte ich mal gebastelt, als es auf Arbeit Probleme mit dem Netzwerk gab. Man kann mehrere Ziele und einen Intervall festlegen. Die Ergebnisse werden auch protokolliert.
mfg Ingo

siro
Beiträge: 794
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Synapse PingSend result [gelöst]

Beitrag von siro »

Guten Morgen,

ersteinmal vielen Dank Shokwave. Ich glaube auch, das ist die bessere "richtige" Vorgehensweise zusätzlich den Ping.ReplyError abzufragen.
PingSend liefert TRUE weil irgend jemand etwas zurück liefert und anhand des ReplyError sollte ich dann ermitteln was wirklich passiert ist.

Habe mir auch deinen Code angesehen:
Mir fehlt zwar sqlite3.dll, aber in deine Implementation konnte ich ja trotzdem reingucken:
FTarget.CurrentLogEntry.Successful := FPingCmd.Ping(FTarget.Address) and (FPingCmd.ReplyError = IE_NoError);

Mit meinem Test auf gleiche IP geht zwar irgendwie, aber das fühlt sich nicht richtig an. :wink:
Vielen Dank für deine Mühe.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Antworten