Im Netzwerk angemeldete Computer.

Alle Fragen zur Netzwerkkommunikation
Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.
Dateianhänge
IpScan_.7z
(3.09 MiB) 63-mal heruntergeladen
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

Das siebente Gerät hat erst nach Ablauf des TimeOut geantwortet. Das heißt nach 3005 ms.

test.png
Dateianhänge
IpScan_2.7z
(3.09 MiB) 58-mal heruntergeladen
Gruß Garfield

c18x37
Beiträge: 5
Registriert: Mo 23. Nov 2015, 12:57

Re: Im Netzwerk angemeldete Computer.

Beitrag von c18x37 »

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:


Ich verstehe den Fehler nicht so ganz.
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;


Demnach ist TInAdr immer 4 Bytes lang, man kann ihn nur unterschiedlich beschreiben/auslesen.
Sollten sich die Dateien bei den Versionen wirklich so unterscheiden?

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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

Code: Alles auswählen

  _In_     LPVOID                 RequestData,
  _In_     WORD                   RequestSize,
  _In_opt_ PIP_OPTION_INFORMATION RequestOptions,

nil und 0 nimmt.
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.

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;
 

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
[Window Title]
Fehler

[Content]
Projekt IpScan hat Exception-Klasse »External: SIGSEGV« ausgelöst.

Bei Adresse 10000935A

[Ok]


move.png
Dateianhänge
IpScan_3.7z
(3.16 MiB) 57-mal heruntergeladen
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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

Michl
Beiträge: 2340
Registriert: Di 19. Jun 2012, 12:54

Re: Im Netzwerk angemeldete Computer.

Beitrag von Michl »

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.
Habe es eben mal getestet. So geht es bei mir (mit einer Konvertierung zu einem WideString):

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: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.
Dateianhänge
IpScan_5.7z
(3.11 MiB) 56-mal heruntergeladen
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

MIt einer zusätzlichen Variablen läßt sich der Data-String übernehmen:

Code: Alles auswählen

var
  ...
  tmp : Pchar;
begin
  ...
            move(ReplyBuffer^.Data, tmp, fPingReply.DataSize);
            fPingReply.Data := tmp;
  ...
end;

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.
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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) 49-mal heruntergeladen
Gruß Garfield

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

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.
Gruß Garfield

mschnell
Beiträge: 3417
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.

Beitrag von mschnell »

Anscheinend gibt es Uneinigkeit darüber, was genau gesucht wird.

Gibt es von den einzelnen Programmen eine Beschreibung was genau sie (wie) suchen ?

-Michael

Garfield
Beiträge: 136
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0
CPU-Target: 64Bit
Wohnort: Aken

Re: Im Netzwerk angemeldete Computer.

Beitrag von Garfield »

Garfield hat geschrieben:

Code: Alles auswählen

var
  ...
  tmp : Pchar;
begin
  ...
            move(ReplyBuffer^.Data, tmp, fPingReply.DataSize);
            fPingReply.Data := tmp;
  ...
end;

Move war das erste funktionierende was ich gefunden hatte. Die zusätzliche Variable hat mir nicht gefallen und jetzt habe ich das richtige gefunden:

Code: Alles auswählen

SetString(fPingReply.Data, ReplyBuffer^.Data, fPingReply.DataSize);
Gruß Garfield

Antworten