![]() |
Ping received Bytes
Moin zusammen, ich habe ein kleines Programm zum anpingen von IP-Adressen geschrieben/ zusammengeschustert.
Nun fällt mir jedoch auf, das die "received Bytes" immer nur 4 Byte sind (über cmd sind es 32). Kann man das irgendwo anpassen? im ICMP steht das PacketSize auf 32.
Delphi-Quellcode:
unit PingU;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdComponent, IdRawBase, IdRawClient, IdIcmpClient, Vcl.StdCtrls, IdBaseComponent, System.UITypes, Vcl.ExtCtrls; type TPing = class(TForm) lstreplies: TListBox; ICMP: TIdIcmpClient; btnPing: TButton; edt_host1: TLabeledEdit; edt_host2: TLabeledEdit; edCount: TLabeledEdit; procedure btnPingClick(Sender: TObject); procedure ICMPReply(ASender: TComponent; const AReplyStatus: TReplyStatus); private { Private-Deklarationen } public { Public-Deklarationen } end; var Ping: TPing; implementation {$R *.dfm} procedure TPing.ICMPReply(ASender: TComponent; const AReplyStatus: TReplyStatus); var sTime: string; formattedDateTime : string; begin // Antwort - Zeit überprüfen if (ICMP.ReplyStatus.MsRoundTripTime = 0) then sTime := '<1' else sTime := '='; // Füge der Listbox die Items hinzu datetimetostring(formattedDateTime, 'dd.mm.yyyy hh:mm:ss', now()); lstReplies.Items.Add(formattedDateTime + ' - ' + Format('Antwort von %s: Bytes=%d Zeit%s%dms TTL=%d', [ICMP.ReplyStatus.FromIpAddress, ICMP.ReplyStatus.BytesReceived, sTime, ICMP.ReplyStatus.MsRoundTripTime, ICMP.ReplyStatus.TimeToLive])); end; procedure TPing.btnPingClick(Sender: TObject); var i: integer; formattedDateTime : string; IP, Land : string; begin // Listbox leeren lstReplies.Clear; // Ereignis 'OnReply' festlegen ICMP.OnReply := ICMPReply; // ReceiveTimeout einstellen ICMP.ReceiveTimeout := 1000; // Button Ping auf Enabled=False setzen btnPing.Enabled := False; // Ping starten // ... Land und IP wird hier definiert, muss ich hier aber raus kürzen // lstReplies.Items.Add('Filiale : ' + edt_host1.Text); lstReplies.Items.Add('Gerät : ' + edt_host2.Text); lstReplies.Items.Add('IP : ' + IP); lstReplies.Items.Add('Dauer : ' + edCount.Text + ' Min. = ' + inttostr(strtoint(edCount.text)*60) + ' Pings'); lstreplies.TopIndex := lstreplies.Items.Count-1; try // Host festlegen ICMP.Host := IP; // Ping so oft durchführen wie bei 'Anzahl der Pings' festgelegt for i := 1 to strtoint(edCount.text)*60 do begin Sleep(1000); datetimetostring(formattedDateTime, 'dd.mm.yyyy hh:mm:ss', now()); try // Ping senden ICMP.Ping; // Nachrichten verarbeiten Application.ProcessMessages; lstreplies.TopIndex := lstreplies.Items.Count-1; except lstReplies.Items.Add(formattedDateTime + ' - ' + 'Zeitüberschreitung der Anforderung'); lstreplies.TopIndex := lstreplies.Items.Count-1; end; end; finally // Button Ping wieder auf Enabled=True btnPing.Enabled := True; end; end; end. |
AW: Ping received Bytes
eventuell
Delphi-Quellcode:
?
ICMP.PacketSize := 32;
|
AW: Ping received Bytes
Der ist ja auf 32 (Standard) eingestellt und das zusätzliche definieren habe ich auch schon probiert, leider mit dem gleichen Ergebnis (egal welcher Wert hier vorgegeben wird, received ist immer 4).
Daher vermute ich das ich das woanders einstellen muss? |
AW: Ping received Bytes
Remy LeBeau gibt hier
![]() Der Artikel beschreibt auch dass die Anzahl Bytes selbst dann größer Null ist wenn ein Fehler auftritt. Es muss der Status ausgewertet werden, der in ReplyStatus.ReplyStatusType nach dem Ping steht. |
AW: Ping received Bytes
Dann bin ich "raus" denn der Teil gehörte zu dem, den ich mir aus dem Internet zusammen geschustert habe, da ich von den Indy Komponenten keine große Ahnung habe.
Hätte es nun so geschrieben:
Delphi-Quellcode:
Bekomme beim Ausführen dann aber den Fehler "ungültige Gleitkommaoperation". Kann das aber aktuell nicht sehen bzw. das Programm hängt sich auf.
//Oberer Block
lstReplies.Items.Add('Filiale: ' + edt_host1.Text); lstReplies.Items.Add('Gerät : ' + device); lstReplies.Items.Add('IP : ' + IP); lstReplies.Items.Add('Dauer : ' + inttostr(strtoint(edCount.Text)*60) + ' Pings' + ' = ~' + inttostr(trunc(strtoint(edCount.text)*1.083)) + ' Min.'); lstreplies.TopIndex := lstreplies.Items.Count-1; //Zeit definieren times := timetostr(now()); ms := 0; try // Host festlegen ICMP.Host := IP; // Ping so oft durchführen wie bei 'Anzahl der Pings' festgelegt for i := 1 to strtoint(edCount.text)*60 do begin Sleep(1000); elapsed.Caption := timetostr(now() - strtotime(times)); datetimetostring(formattedDateTime, 'dd.mm.yyyy hh:mm:ss', now()); // Ping senden ICMP.Ping; if ICMP.ReplyStatus.ReplyStatusType = rsEcho then begin // got some data, connection is up datetimetostring(formattedDateTime, 'dd.mm.yyyy hh:mm:ss', now()); lstReplies.Items.Add(formattedDateTime + ' - ' + Format('Antwort von %s: Bytes=%d Zeit%s%dms TTL=%d', [ICMP.ReplyStatus.FromIpAddress, ICMP.ReplyStatus.BytesReceived, sTime, ICMP.ReplyStatus.MsRoundTripTime, ICMP.ReplyStatus.TimeToLive])); //Werte für Durschschnittszeitberechnung sammeln ms := ms + strtoint(split(split(Format('%s%dms',[sTime,ICMP.ReplyStatus.MsRoundTripTime]), '=', 1), 'm', 0)); end else if ICMP.ReplyStatus.ReplyStatusType = rsTimeout then begin // have a timeout, link is down lstReplies.Items.Add(formattedDateTime + ' - ' + 'Zeitüberschreitung der Anforderung'); end else begin // some other response, do something else... end; lstreplies.TopIndex := lstreplies.Items.Count-1; end; finally // Button Ping wieder auf Enabled=True btnPing.Enabled := True; lstReplies.Items.Add(''); lstReplies.Items.Add('Ping Statistik für ' + IP + ':'); ms := trunc(ms / (i-1)); lstReplies.Items.Add('Durschnittliche Zeit: ' + inttostr(ms)+ 'ms' ); lstreplies.TopIndex := lstreplies.Items.Count-1; end; Edit: Ohne den Sleep(1000) funktioniert es aber dann natürlich kein Ping jede Sekunde und somit viel zu schnell. Mit Sleep(1000) zeigt er nicht die einzelnen neuen Zeilen an und das Programm scheint abgestürzt zu sein, läuft aber noch. Edit2: Über einen Timer anstatt einer Schleife läuft es Einwandfrei -.- |
AW: Ping received Bytes
Schau doch mal bei
![]() |
AW: Ping received Bytes
Oder wieder einmal asynchron mit Overbyte, hier im Beispiel mit Size=100
Delphi-Quellcode:
procedure TForm45.Button1Click(Sender: TObject);
begin ping1.DnsLookup( 'www.delphipraxis.net' ); end; procedure TForm45.Ping1DnsLookupDone(Sender: TObject; Error: Word); begin if Error = 0 then begin ping1.Address := Ping1.DnsResult; ping1.Size := 100; ping1.Ping; end; end; procedure TForm45.Ping1EchoReply(Sender, Icmp: TObject; Status: Integer); begin if status <> 0 then ShowMessage( ping1.Reply.DataSize.ToString ); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz