Im Netzwerk angemeldete Computer.

Alle Fragen zur Netzwerkkommunikation
Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

@Michael, gesucht werden die IPs aller am Netzwerk angemeldeten Geräte. Dazu soll die MAC und der Name des Gerätes ermittelt werden.

Ultra Ping und LuckiePing pingen die IPs. Bei LuckiePing ist der Quelltext dabei. Wie Anpry IP Scanner arbeitet habe ich nicht nachgesehen. Zu Advenced IP Scanner steht nichts in der Beschreibung.
Gruß Garfield

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Wenn ich Wireshark richtig lese, macht Advanced IP Scanner:

  • Broadcast - ARP - Who has {IP}? für jede IP
  • jede IP - ICMP - Echo (Ping)
  • jede IP - TCP - Port 80
  • jede IP - TCP - Port 21
  • jede IP - TCP - Port 445
  • jede IP - TCP - Port 4899
Es werden immer 94 IPs auf einmal verarbeitet. Die Ports sind 80 - HTTP, 21 - FTP Kontrolle, 445 - Microsoft-DS SMB-Freigaben (SAMBA) und 4899 - UDP Radmin. (https://de.wikipedia.org/wiki/Liste_der ... rten_Ports)

Wenn eine IP gefunden wurde gibt es eine Anfrage über NBNS Name query NBSTAT.

AIPS.png
ipscan.png
Gruß Garfield

mschnell
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.

Beitrag von mschnell »

Garfield hat geschrieben:@Michael, gesucht werden die IPs aller am Netzwerk angemeldeten Geräte. Dazu soll die MAC und der Name des Gerätes ermittelt werden. .

Wie schon detailliert ausgeführt gibt es keine "Anmeldung am Netzwerk" (ohne genaue Erklärung was denn da gemeint ist).

-Michael

mschnell
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.

Beitrag von mschnell »

Garfield hat geschrieben:... für jede IP ...
Was ist "jede IP" alle 2 hoch 32 (beziehungsweise noch viel mehr bei ipv6)
Dann werden auch alle im Internet erreichbaren "Geräte" angesprochen, da ist ARP und ICMP aber normalerweise gesperrt.

-Michael

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Ach Michael, irgendwie kommst Du mir gegen den Strich gebürstet oder auch nur ein wenig genervt vor. :wink:

Anscheinend sind meine Kenntnisse zu schlecht. Ich dachte, jeder Rechner müsste sich anmelden und würde dann eine IP zugeteilt bekommen. Konkret meine ich alle Rechner welche im Heimnetzwerk erreichbar sind. Diese sind nach meiner Kenntnis im selben Subnetz, im Beispiel auf den Bildern 192.168.0. Was mit jeder IP gemeint ist, kann man für dieses Beispiel auf den beiden Bildern sehen. Da ist der Bereich von 192.168.0.1 bis 192.168.0.254 angegeben.

Der konkrete Hintergrund ist folgender: In einem Heimnetzwerk soll ein bestimmtes Gerät ausgewählt werden. Damit der Anwender dieses Gerät auswählen kann, sollen ihm alle verfügbaren Geräte angezeigt werden.

Und wenn ich schon ein Programm für jemand anderen schreibe, sollte es auch ordentlich funktionieren.
Gruß Garfield

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Synapse verwendet in der Function TPINGSend.InternalPingIpHlp die Funktionen Icmp6SendEcho2 und IcmpSendEcho2, allerdings ohne Callbackfunktion. Und in TPINGSend.InternalPing wird ein TICMPBlockSocket verwendet.
Gruß Garfield

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Im Netzwerk angemeldete Computer.

Beitrag von Christian »

Ein Netzwerk kann nicht nur aus einem Subnetz bestehen. Solang seine SW nur bei dir funktionieren soll/muss kannst du ja mit Halbwissen vogrhen. Wenn andere deine SW einsetzen sollen wärs schon gut wenn du dich in die Materie etwas einliest.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
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.

Beitrag von mschnell »

Garfield hat geschrieben:Ich dachte, jeder Rechner müsste sich anmelden und würde dann eine IP zugeteilt bekommen. Konkret meine ich alle Rechner welche im Heimnetzwerk erreichbar sind. .

Wie oben schon beschrieben stimmt das so nicht.

Was Du beschreibst ist "DHCP". Hierzu gibt es einen "DHCP-Server" der z.B. auf einem DSL-Router installiert sein kann. Er kann aber auch auf einem Linux-Server aktiviert werden. Er kann aber auch nicht vorhanden oder deaktiviert sein. Um DHCP zu nutzen machen die Rechner (beim starten und in regelmäßigen Abständen) einen "DHCP-Braoadcast". Ein aktiver DHCP-Server teilt ihnen daraufhin eine IP-Adresse zu. Er merkt sich dazu die MAC-Adresse des Rechners und die zugeteilte IP, damit er sie nicht doppelt vergibt und bei einer erneuten Anfrage desselben Rechners dieselbe IP nennt.

Es gibt aber kein zwingend aktiviertes Standard-Protokoll, um auf diese Liste zuzugreifen. Da die Rechner bei DHCP auch ihren "Netzwerk-Namen" bekanntgeben, kann der DHCP-Server auch diesen speichern. In einem "anständigen" Netzwerk gibt es auch (mindestens) einen lokalen DNS-Server der auf Anfrage Zuordnungen zwischen Netzwerk-Namen und IP-Adressen bekannt gibt. Der DNS-Server kann dann diese Zuordnung für die "lokalen" Rechner vom DHCP-Server bekommen (wenn beides auf einem Linux-Rechner läuft).

Aber ein lokaler "Rechner" muss nicht unbedingt DHCP verwenden. Er kann auch eine IP-Adresse fest eingestellt haben. Der DHCP-Server sieht ihn dann gar nicht.

Außerdem kann ein Rechner auch mehrere Netzwerk-Anschlüsse haben und die haben dann jeweils eine IP-Adresse (fest oder per DHCP).

Außerdem kann einen Netzwerk auch aus mehreren "Strängen" bestehen die durch Router verbunden sind. Dann kann für jeden Netzwerk-Strang ein DHCP-Server aktiv sein. So gesehen ist das ganze Internet ein "Netzwerk". Wo will man also "suchen" ? Zumindest muss die Such-Routine also die Netzwerk-IP Adresse (und Maske) für jedes Subnetz gesagt bekommen.

Heute bestehen ja auch Heim-Netze oft aus einem Drahtgebundenen und einem WLAN "Netzwerk". Oft können Rechner alternativ mit einem von beiden oder auch gleichzeitig an beiden (siehe "mehrere Netzwerk_Anschlüsse) verbunden sein.

-Michael

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Scheint alles nicht so einfach zu sein. :?

mschnell hat geschrieben:Heute bestehen ja auch Heim-Netze oft aus einem Drahtgebundenen und einem WLAN "Netzwerk". Oft können Rechner alternativ mit einem von beiden oder auch gleichzeitig an beiden (siehe "mehrere Netzwerk_Anschlüsse) verbunden sein.

An meiner Fritzbox sind über LAN ein Drucker und zwei Rechner verbunden, über WLAN zwei Laptop und mehrere Smartphones/Tablettes.

mschnell hat geschrieben:Geräte mit fest eingestellten IP-Adressen sieht die Fritz-Box auch nicht.

Die Fritzbox zeigt im Heimnetzwerk meinen Netzwerkdrucker an. Alle Geräte sind mit Namen und der Art wie sie verbunden sind (Lan oder WLAN), angegeben. Da der Drucker HTTP unterstützt ist der Name ein Link der auf die IP verweist.
Gruß Garfield

Benutzeravatar
W126
Lazarusforum e. V.
Beiträge: 53
Registriert: Mo 27. Jul 2015, 11:19
OS, Lazarus, FPC: Linux
CPU-Target: Xeon Silver x64
Wohnort: Hofheim am Taunus

Re: Im Netzwerk angemeldete Computer.

Beitrag von W126 »

mschnell hat geschrieben:
Garfield hat geschrieben:... für jede IP ...
Was ist "jede IP" alle 2 hoch 32 (beziehungsweise noch viel mehr bei ipv6)
Dann werden auch alle im Internet erreichbaren "Geräte" angesprochen, da ist ARP und ICMP aber normalerweise gesperrt.

-Michael



Ja, wenn Du willst und die Zeit hast geht Advanced IP Scanner alle diese IPs durch. Bei uns geht er jeden Monat den Bereich 192.168.x.x komplett durch.

Benutzeravatar
W126
Lazarusforum e. V.
Beiträge: 53
Registriert: Mo 27. Jul 2015, 11:19
OS, Lazarus, FPC: Linux
CPU-Target: Xeon Silver x64
Wohnort: Hofheim am Taunus

Re: Im Netzwerk angemeldete Computer.

Beitrag von W126 »

Garfield hat geschrieben:Scheint alles nicht so einfach zu sein. :?

mschnell hat geschrieben:Heute bestehen ja auch Heim-Netze oft aus einem Drahtgebundenen und einem WLAN "Netzwerk". Oft können Rechner alternativ mit einem von beiden oder auch gleichzeitig an beiden (siehe "mehrere Netzwerk_Anschlüsse) verbunden sein.

An meiner Fritzbox sind über LAN ein Drucker und zwei Rechner verbunden, über WLAN zwei Laptop und mehrere Smartphones/Tablettes.

mschnell hat geschrieben:Geräte mit fest eingestellten IP-Adressen sieht die Fritz-Box auch nicht.

Die Fritzbox zeigt im Heimnetzwerk meinen Netzwerkdrucker an. Alle Geräte sind mit Namen und der Art wie sie verbunden sind (Lan oder WLAN), angegeben. Da der Drucker HTTP unterstützt ist der Name ein Link der auf die IP verweist.


Die Firtzbox scheint dieses Problem etwas anders anzugehen. Geräte die sich keine IP vom DHCP holen (anmelden ;-) ) werden erst angezeigt wenn diese Datenverkehr über die Fritzbox haben. Wir haben Smart Switches und Load Balancer im Einsatz und an einem Internet-Zugang eine Fritzbox. Diese zeigt Geräte die über einen anderen Router laufen nicht an. Also sucht diese nicht aktiv, sondern wartet bis ein Paket von einem Gerät kommt.

Dein Ansatz ist doch schon sehr gut!

Gruß Jörg

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

W126 hat geschrieben:Dein Ansatz ist doch schon sehr gut!

Danke.

Ich werde mich etwas mehr mit Netzwerken beschäftigen. Jetzt habe ich zwei Ding, welche ich ausprobieren will. Das sind GetIpAddrTable function und ResolveIpNetEntry2 function.
Gruß Garfield

Benutzeravatar
W126
Lazarusforum e. V.
Beiträge: 53
Registriert: Mo 27. Jul 2015, 11:19
OS, Lazarus, FPC: Linux
CPU-Target: Xeon Silver x64
Wohnort: Hofheim am Taunus

Re: Im Netzwerk angemeldete Computer.

Beitrag von W126 »

Schau doch mal was Michael Puff programmiert hat (http://michael-puff.de/Programmierung/Delphi/Programme ). Ich hatte mich mit Netzwerk vor langer Zeit unter Delphi versucht. Bei ihm hatte ich ein paar Infos gefunden.

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Danke. Michael hat ein paar feine Sachen dabei. Sein LuckiePing hatte ich mir auch mal herunter geladen. Aber das funktionierte bei mir unter Win10 nicht. Networkinfo, Internetmonitor und Portscanner werde ich mir jetzt mal ansehen.

Jetzt habe ich GetIpAddrTable so drin:

Code: Alles auswählen

type
  _MIB_IPADDRROW = packed record
    dwAddr      : DWORD;            //  The IPv4 address in network byte order.
    dwIndex     : DWORD;            //  The index of the interface associated with this IPv4 address.
    dwMask      : DWORD;            //  The subnet mask for the IPv4 address in network byte order.
    dwBCastAddr : DWORD;            //  The broadcast address in network byte order. A broadcast address is typically the IPv4 address with the host portion set to either all zeros or all ones.
    dwReasmSize : DWORD;            //  The maximum re-assembly size for received datagrams.
    unused1     : USHORT;           //  This member is reserved.
    wType       : USHORT;           //  The address type or state. This member can be a combination of the following values.
  end;
  PMIB_IPADDRROW = ^_MIB_IPADDRROW;
 
type
  _MIB_IPADDRTABLE = packed record
    dwNumEntries : DWORD;
    table        : Array of _MIB_IPADDRROW;
  end;
  PMIB_IPADDRTABLE = ^_MIB_IPADDRTABLE;
  TMIB_IPAddrTable = _MIB_IPADDRTABLE;
 
type
  TGetIpAddrTable = function (pIpAddrTable: PMIB_IPADDRTABLE; pdwSize: PULONG; bOrder: LongBool): DWORD; stdcall;
 
var
  GetIpAddrTable : TGetIpAddrTable;
 
function IpAddrTable: IPAddrEntries;
{*******************************************************************************
*  IP Tabelle holen.
}

var
  pIPAddrTable : PMIB_IPADDRTABLE;
  dwSize       : DWORD;
  dwRetVal     : DWORD;
  bOrder       : LongBool;
  In_Addr      : IPAddr;
  lpMsgBuf     : LPVOID;   // Fehlermeldung
  i            : Integer;
begin
  // Init
  pIPAddrTable   := nil;
  dwSize         := 0;
  dwRetVal       := 0;
  In_Addr.S_addr := 0;
  // Speicher für die erste Antwort (Anzahl der Anträge und erste Tabelle) reservieren.
  pIPAddrTable   := AllocMem(SizeOf(_MIB_IPADDRTABLE));
  if Assigned(pIPAddrTable)
  then begin
    // Größe des für die Antwort notwendigen Speichers ermitteln.
    bOrder := False; // Antwort unsortiert.
    if GetIpAddrTable(pIPAddrTable, @dwSize, bOrder) = ERROR_INSUFFICIENT_BUFFER
    then begin
      // Speicher für die Antwort auf die erforderliche Größe erweitern.
      FreeMem(pIPAddrTable);
      pIPAddrTable := AllocMem(dwSize);
      //pIPAddrTable := ReAllocMem(pIPAddrTable, dwSize);
      if Assigned(pIPAddrTable)
      then begin
        bOrder := False; // Antwort unsortiert.
        dwRetVal := GetIpAddrTable(pIPAddrTable, @dwSize, bOrder);
        if successful(dwRetVal)
        then begin
          // Tabelle übernehmen.
          if pIPAddrTable^.dwNumEntries > 0
          then begin
            SetLength(Result, pIPAddrTable^.dwNumEntries);
            for i := 0 to pIPAddrTable^.dwNumEntries - 1
            do begin
              Result[i].dwAddr      := pIPAddrTable^.table[i].dwAddr;       //  The IPv4 address in network byte order.
              Result[i].dwIndex     := pIPAddrTable^.table[i].dwIndex;      //  The index of the interface associated with this IPv4 address.
              Result[i].dwMask      := pIPAddrTable^.table[i].dwMask;       //  The subnet mask for the IPv4 address in network byte order.
              Result[i].dwBCastAddr := pIPAddrTable^.table[i].dwBCastAddr//  The broadcast address in network byte order. A broadcast address is typically the IPv4 address with the host portion set to either all zeros or all ones.
              Result[i].dwReasmSize := pIPAddrTable^.table[i].dwReasmSize//  The maximum re-assembly size for received datagrams.
              Result[i].unused1     := pIPAddrTable^.table[i].unused1;      //  This member is reserved.
              Result[i].wType       := pIPAddrTable^.table[i].wType;        //  The address type or state. This member can be a combination of the following values.
            end;
          end;
        end;
        if Assigned(pIPAddrTable)
        then begin
          Freemem(pIPAddrTable);
          pIPAddrTable := nil;
        end;
      end;
    end;
  end;
end;


Ich habe versucht, die DWORD in IP-String umzuwandeln:

Code: Alles auswählen

function IPAddrToStr(const aIPAddr: DWORD): String;
{*******************************************************************************
*  Eine IPAddr in einen String umwandeln.
}

begin
  Result := Format('%d.%d.%d.%d', [aIPAddr and $FF000000 shr 24, aIPAddr and $FF0000 shr 16, aIPAddr and $FF00 shr 8, aIPAddr and $FF]);
end;


Aber das passt nicht. Damit scheint etwas durcheinander zu kommen.

Unbenannt.png


Und es scheinen nicht die IP-Adressen zu sein, welche ich suche. Obwohl sie es sein sollten. http://www.winsocketdotnetworkprogrammi ... on13g.html

Was ich nicht ganz versehe, von den Smartphones bekomme ich meist den Fehler 67 (Host nicht erreichbar), wenn sie in Benutzung sind bzw im Standby. Jetzt wurden sie über Nacht nicht benutzt, sind im Standby und ich bekam beim ersten Aufruf von allen die MAC angezeigt. Beim zweiten Aufruf schon nicht mehr.
Zuletzt geändert von Garfield am So 16. Okt 2016, 14:58, insgesamt 1-mal geändert.
Gruß Garfield

Benutzeravatar
Garfield
Beiträge: 172
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.

Beitrag von Garfield »

Habe mir gerade GetMAC von Michael Puff angesehen. Das hat alle MAC und bis auf einen alle Gerätenamen geholt. Genauso wie die App Fing.

Nachtrag: War Glückstreffer. Danach gab es auch hier ab und zu den Fehler 67.
Gruß Garfield

Antworten