Im Netzwerk angemeldete Computer.
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Im Anhang ist mein derzeitiger funktionierender Stand (EXE und SRC). Hier in der "Ferienwohnung" (eigentlich Monteurszimmer) findet die App Fing sieben Geräte im Netzwerk. IpScan findet davon fünf. UltraPing von pacman1986 findet ebenfalls fünf. Gibt allerdings es bei einem eine etwas andere IP an. Fing und IpScan haben an letzter Stelle 157, UPing 147. Das Programm arbeitet ohne Threads. Der Scan hat drei, vier Minuten gedauert.
Eines der nicht gefundenen Geräte war mein Smartphone. Es war im Ruhezustand. Beim letzten Scan hatte ich etwas nachgesehen und es wurde gefunden.
Eines der nicht gefundenen Geräte war mein Smartphone. Es war im Ruhezustand. Beim letzten Scan hatte ich etwas nachgesehen und es wurde gefunden.
- Dateianhänge
-
IpScan_.7z
- (3.09 MiB) 133-mal heruntergeladen
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Das siebente Gerät hat erst nach Ablauf des TimeOut geantwortet. Das heißt nach 3005 ms.
- Dateianhänge
-
IpScan_2.7z
- (3.09 MiB) 162-mal heruntergeladen
Gruß Garfield
Re: Im Netzwerk angemeldete Computer.
Ich verstehe den Fehler nicht so ganz.Garfield hat geschrieben:Ich habe mich für Embarcadero® Delphi 10.1 Berlin Starter registriert. Nach der Installation habe ich mir den Ping dort angesehen und heute diesen Fehler gefunden:
Habe hier auch ein Delphi 10.1 am laufen, allerdings Enterprise.
Da ist in Winapi.Winsock2 der Record so definiert:
Code: Alles auswählen
type
SunB = record
s_b1, s_b2, s_b3, s_b4: u_char;
end;
{$EXTERNALSYM SunB}
SunC = record
s_c1, s_c2, s_c3, s_c4: a_char;
end;
{$NODEFINE SunC}
SunW = record
s_w1, s_w2: u_short;
end;
{$EXTERNALSYM SunW}
in_addr = record
case Integer of
0: (S_un_b: SunB);
1: (S_un_c: SunC);
2: (S_un_w: SunW);
3: (S_addr: u_long);
// #define s_addr S_un.S_addr // can be used for most tcp & ip code
// #define s_host S_un.S_un_b.s_b2 // host on imp
// #define s_net S_un.S_un_b.s_b1 // netword
// #define s_imp S_un.S_un_w.s_w2 // imp
// #define s_impno S_un.S_un_b.s_b4 // imp #
// #define s_lh S_un.S_un_b.s_b3 // logical host
end;
{$EXTERNALSYM in_addr}
TInAddr = in_addr;
PInAddr = ^in_addr;
Sollten sich die Dateien bei den Versionen wirklich so unterscheiden?
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Hm. Ich habe mich wohl nicht ganz klar ausgedrückt. Ich habe Delphi genommen weil es bei einigem fehlertoleranter ist.
Mein Fehler bestand darin, dass ich DestinationAddress als TInAddr deklariert hatte. Der Funktionsaufruf funktionierte mit dieser Deklaration weder in Delphi noch in Lazarus. Das Pascal-TInAddr scheint etwas anderes als das Microsoft-IPAddr zu sein. In dem Delphi-Beispiel war IPAddr als DWord deklariert. Deshalb habe ich DestinationAddress als DWord deklariert. Und mit dieser Deklaration funktioniert die Funktion. Das verstehe ich nicht, denn in ICMP_ECHO_REPLY funktioniert es mit TInAddr.
Mein Fehler bestand darin, dass ich DestinationAddress als TInAddr deklariert hatte. Der Funktionsaufruf funktionierte mit dieser Deklaration weder in Delphi noch in Lazarus. Das Pascal-TInAddr scheint etwas anderes als das Microsoft-IPAddr zu sein. In dem Delphi-Beispiel war IPAddr als DWord deklariert. Deshalb habe ich DestinationAddress als DWord deklariert. Und mit dieser Deklaration funktioniert die Funktion. Das verstehe ich nicht, denn in ICMP_ECHO_REPLY funktioniert es mit TInAddr.
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
In Delphi 10.1 und Lazarus 1.6/FPC 3 läuft es so lange man keine Daten mit gibt. Das für die Variablen
nil und 0 nimmt.
Code: Alles auswählen
_In_ LPVOID RequestData,
_In_ WORD RequestSize,
_In_opt_ PIP_OPTION_INFORMATION RequestOptions,
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
IcmpSendEcho funktioniert nicht mit IPAddr bzw. TIn_Addr weil in meiner Deklaration ein const vor der Variablen steht. Warum ich die const überhaupt hingeschrieben habe weiß ich nicht mehr. Interessanterweise funktionieren die Funktionen auch ohne name '*'.
Nachtrag: Den Zusatz name braucht man nur wenn sich die Namen unterscheiden.
Nachtrag: Ohne const kann man Requestdaten angeben.
Nachtrag: Den Zusatz name braucht man nur wenn sich die Namen unterscheiden.
Nachtrag: Ohne const kann man Requestdaten angeben.
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Jetzt habe ich es soweit, dass das Pingen grundsätzlich funktioniert. Jedoch mache ich etwas falsch wenn ich die Antwortdaten aus dem Buffer übernehmen will.
Beim move wird der richtige Text zurückgegeben. Allerdings wird da der Wert für Error gleich mitverändert und wenn Error gesetzt werden soll gibt es einen
Code: Alles auswählen
type
TPingReply = record
Result : DWORD;
Address : TInAddr;
Status : LongInt;
RoundTripTime : LongInt;
DataSize : USHORT;
Data : String;
Error : String;
end;
icmp_echo_reply = record
Address : TInAddr;
Status : ULONG;
RoundTripTime : ULONG;
DataSize : USHORT;
Reserved : USHORT;
Data : PVOID;
Options : ip_option_information;
end;
PICMP_ECHO_REPLY = ^icmp_echo_reply;
var
...
ReplyBuffer : PICMP_ECHO_REPLY;
...
begin
..
// Pingen
dwRetVal := IcmpSendEcho(hIcmpFile, DestAddr, PChar(RequestData), SizeOf(RequestData) + Length(RequestData), RequestOptions, @ReplyBuffer[0], ReplySize, aTimeOut);
PingReply.Result := dwRetVal;
Result := not((dwRetVal = NO_ERROR) or (dwRetVal >= ERROR_INSUFFICIENT_BUFFER));
if Result
then begin
PingReply.Address := ReplyBuffer^.Address;
PingReply.Status := ReplyBuffer^.Status;
PingReply.RoundTripTime := ReplyBuffer^.RoundTripTime;
PingReply.DataSize := ReplyBuffer^.DataSize;
// move(ReplyBuffer^.Data, PingReply.Data, PingReply.DataSize);
PingReply.Error := '';
end;
[Window Title]
Fehler
[Content]
Projekt IpScan hat Exception-Klasse »External: SIGSEGV« ausgelöst.
Bei Adresse 10000935A
[Ok]
- Dateianhänge
-
IpScan_3.7z
- (3.16 MiB) 133-mal heruntergeladen
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Die meisten Beispiele geben sich mit einem logischen Ergebnis zufrieden. Nur einmal habe ich gesehen, dass die Pingtime ausgewertet wird. Auf https://theroadtodelphi.com/2011/02/02/ ... d-the-wmi/ gibt es ein Konsolenprogramm mit WMI. Das funtkioniert mit Delphi 10.1 wie erwartet. Bei Lazarus gibt es beim ExecQuery eine EOleException:Die Anfrage ist ungültig.
Gruß Garfield
Re: Im Netzwerk angemeldete Computer.
Habe es eben mal getestet. So geht es bei mir (mit einer Konvertierung zu einem WideString):Garfield hat geschrieben:Die meisten Beispiele geben sich mit einem logischen Ergebnis zufrieden. Nur einmal habe ich gesehen, dass die Pingtime ausgewertet wird. Auf https://theroadtodelphi.com/2011/02/02/ ... d-the-wmi/ gibt es ein Konsolenprogramm mit WMI. Das funtkioniert mit Delphi 10.1 wie erwartet. Bei Lazarus gibt es beim ExecQuery eine EOleException:Die Anfrage ist ungültig.
Code: Alles auswählen
FWbemObjectSet:= FWMIService.ExecQuery(WideString(Format('SELECT * FROM Win32_PingStatus where Address=%s AND BufferSize=%d',[QuotedStr(Address),BufferSize])),WideString('WQL'),0);
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Danke Michl. Die Lösung ist zu einfach, als dass ich darauf gekommen bin. Bei Delphi 10.1 ist String gleich Widestring, bei Lazarus ist mit String gleich Ansistring eingestellt.
Ich habe es gleich ausprobiert und es funktioniert. Dann muss ich nur gucken, was besser geht. Lohnt sich wohl aber nur wenn das Problem mit move gelöst wird.
Heute habe ich mich ein wenig mit Threads beschäftigt. Das Ergebnis ist im Anhang. Es findet jedoch nur sechs der sieben Geräte, die Fing findet.
Ich habe es gleich ausprobiert und es funktioniert. Dann muss ich nur gucken, was besser geht. Lohnt sich wohl aber nur wenn das Problem mit move gelöst wird.
Heute habe ich mich ein wenig mit Threads beschäftigt. Das Ergebnis ist im Anhang. Es findet jedoch nur sechs der sieben Geräte, die Fing findet.
- Dateianhänge
-
IpScan_5.7z
- (3.11 MiB) 142-mal heruntergeladen
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
MIt einer zusätzlichen Variablen läßt sich der Data-String übernehmen:
So wie es aussieht habe ich den Scanbereich mit 0...255 zu weit gewählt. Für 0 und 255 gibt es TimeOut und für alle anderen nicht vorhandenen IPs Host nicht erreichbar.
Wenn die IP erreichbar ist, bekommt man als Antwortadresse diese IP. Ist die IP nicht erreichbar, ist die AntwortIP vom Server. Beim TimeOut ist die AntwortIP 0.0.0.0.
Code: Alles auswählen
var
...
tmp : Pchar;
begin
...
move(ReplyBuffer^.Data, tmp, fPingReply.DataSize);
fPingReply.Data := tmp;
...
end;
Wenn die IP erreichbar ist, bekommt man als Antwortadresse diese IP. Ist die IP nicht erreichbar, ist die AntwortIP vom Server. Beim TimeOut ist die AntwortIP 0.0.0.0.
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Das ist mein Endergebnis mit Pingen über ICMP. Im getesteten WLan-Netz befinden sich der Router, ein Tablet, ein Laptop und vier Smartphones. Ein Smartphone wurde nur beim Einzel-Ping gefunden. Sonst gab es für das Gerät immer einen TimeOut. Als nächstes will ich mir die WMI-Routine ausprobiern.
- Dateianhänge
-
IpScan_6.7z
- (3.11 MiB) 156-mal heruntergeladen
Gruß Garfield
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Advanced IP Scanner findet alle Geräte (im Moment acht)
Angry IP Scanner findet eines nicht.
Fing App findet alle (Referenz)
LuckiePing findest keines.
Ultra Pingvon pacman1986 findest eines nicht.
Wenn ich mir tcping ansehe (http://www.elifulkerson.com/projects/tcping.php) dann müsste man gucken, das man auf bestimmten Ports pingt.
Angry IP Scanner findet eines nicht.
Fing App findet alle (Referenz)
LuckiePing findest keines.
Ultra Pingvon pacman1986 findest eines nicht.
Wenn ich mir tcping ansehe (http://www.elifulkerson.com/projects/tcping.php) dann müsste man gucken, das man auf bestimmten Ports pingt.
Gruß Garfield
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Im Netzwerk angemeldete Computer.
Anscheinend gibt es Uneinigkeit darüber, was genau gesucht wird.
Gibt es von den einzelnen Programmen eine Beschreibung was genau sie (wie) suchen ?
-Michael
Gibt es von den einzelnen Programmen eine Beschreibung was genau sie (wie) suchen ?
-Michael
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Im Netzwerk angemeldete Computer.
Move war das erste funktionierende was ich gefunden hatte. Die zusätzliche Variable hat mir nicht gefallen und jetzt habe ich das richtige gefunden:Garfield hat geschrieben:Code: Alles auswählen
var ... tmp : Pchar; begin ... move(ReplyBuffer^.Data, tmp, fPingReply.DataSize); fPingReply.Data := tmp; ... end;
Code: Alles auswählen
SetString(fPingReply.Data, ReplyBuffer^.Data, fPingReply.DataSize);
Gruß Garfield