Im Netzwerk angemeldete Computer.

Alle Fragen zur Netzwerkkommunikation

Re: Im Netzwerk angemeldete Computer.

Beitragvon Garfield » 6. Okt 2016, 20:29 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 6. Okt 2016, 21:19 Re: Im Netzwerk angemeldete Computer.

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

test.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon c18x37 » 7. Okt 2016, 06:51 Re: Im Netzwerk angemeldete Computer.

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?
c18x37
 
Beiträge: 5
Registriert: 23. Nov 2015, 12:57

Beitragvon Garfield » 7. Okt 2016, 12:47 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.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 7. Okt 2016, 20:18 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

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

Beitragvon Garfield » 7. Okt 2016, 21:12 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.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 8. Okt 2016, 13:59 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.

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 8. Okt 2016, 18:40 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
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 9. Okt 2016, 22:17 Re: Im Netzwerk angemeldete Computer.

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; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Garfield » 9. Okt 2016, 22:59 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 10. Okt 2016, 18:33 Re: Im Netzwerk angemeldete Computer.

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

Beitragvon Garfield » 10. Okt 2016, 22:23 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 11. Okt 2016, 21:05 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.
Gruß Garfield
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mschnell » 12. Okt 2016, 09:41 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
mschnell
 
Beiträge: 3338
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Garfield » 12. Okt 2016, 15:36 Re: Im Netzwerk angemeldete Computer.

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
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Netzwerk



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried