Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Subnetzmaske/ Server finden (https://www.delphipraxis.net/9580-subnetzmaske-server-finden.html)

EConvertError 29. Sep 2003 16:26


Subnetzmaske/ Server finden
 
Hallo!

Da ich hier neu bin, hoffe ich hier richtig zu sein. :?

Ich bräuchte die IP- Adresse aller Rechner im Netzwerk.
Das hat folgenden Zweck: Auf einem der Rechner habe ich einen Server (Chat) laufen. Per UDP- Broadcasts könnte ich schnell feststellen, auf welchem und mich danach bequem beim Server anmelden. Wie gesagt, dazu bräuchte ich die IP- Adressen.

Eigentlich wollte ich das mit dem Networkcalculator von Indy zu machen, aber der braucht die eigene IP- Adresse (was kein Problem wäre) und die Subnetzmaske. Kann man letzteres irgendwie rausbekommen? Oder geht das ganze einfacher?

mfg,
EConvertError

Chewie 29. Sep 2003 17:07

Re: Subnetzmaske/ Server finden
 
Wenn du die Subnetzmaske nicht benutzt, kannst du ganz einfach 255.255.255.255 nehmen.

Christian Seehase 29. Sep 2003 22:52

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Daten der lokalen Netzwerkkarte herausbekommen kannst Du u.a. mit Hier im Forum suchenGetAdaptersInfo und Hier im Forum suchenGetPerAdapterInfo.

EConvertError 30. Sep 2003 15:57

Re: Subnetzmaske/ Server finden
 
Hallo!
Vielen Dank für eure Hilfe!

@Chewie: Dein Vorschlag hat bei mir leider nicht funktioniert. Nur als ich auch die Networkmask eingegeben habe (die ich ja dann später nicht weiß) ging es.

@Christian Seehase:
Ich werde das mit dem "GetAdaptersInfo" gleich einmal probieren. Weißt du zufällig ob das auch unter Win98 SE funktioniert?

Falls dabei ein Problem auftritt werde ich mich wieder melden (da ich mich hier noch nicht so auskenne: Sollte das in einem neuen Thread geschehen, oder eher hier?).

mfg,
EConvertError

Christian Seehase 30. Sep 2003 17:17

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

das sollte auch unter 98 funktionieren.
Ab diesem Betriebssystem ist die Funktion zumindest dokumentiert.

Zitat:

Zitat von EConvertError
(da ich mich hier noch nicht so auskenne: Sollte das in einem neuen Thread geschehen, oder eher hier?).

Da es wohl unmittelbar mit diesem Thread zu tun haben dürfte, würde ich mal sagen hier.

Surrounder 1. Okt 2003 11:07

Re: Subnetzmaske/ Server finden
 
@EConvertError

denke du müsstest auf jeden Fall die Subnetmask auslesen, denn der Server kann sich ja nur in deinem Subnet befinden, denn ansonsten funktioniert die Kommunikation nicht. Und um die mögliche Anzahl an IP Adressen heraus zu bekommen brauchst Du die Subnetmask. Oder habe ich das falsch verstanden?

SirThornberry 1. Okt 2003 11:42

Re: Subnetzmaske/ Server finden
 
1.*.*.*-127.*.*.* = Klasse A = 255.0.0.0
128.*.*.*-191.*.*.* = Klasse B = 255.255.0.0
192.*.*.*-223.*.*.* = Klasse C = 255.255.255.0

Wenn irgend ein user das allerdings willkürlich eingestellt hat hilft nur noch registry auslesen

Surrounder 1. Okt 2003 13:26

Re: Subnetzmaske/ Server finden
 
Zitat:

Zitat von SirThornberry
1.*.*.*-127.*.*.* = Klasse A = 255.0.0.0
128.*.*.*-191.*.*.* = Klasse B = 255.255.0.0
192.*.*.*-223.*.*.* = Klasse C = 255.255.255.0

Wenn irgend ein user das allerdings willkürlich eingestellt hat hilft nur noch registry auslesen

Ein ClassA oder B Netz wirst Du nur so nie finden, denn dann wären rein Rechnerisch in einm ClassA Netz 16.387.064 Clients in einem Subnet, da würde keine Kommunikation mehr zu stande kommen. Deshalb wird auch in ClassA Netzten mittels Subnetmask Segmentriert. Es werden auch oft Subnetmasken von 255.255.248.0 verwendet oder ähnlich verwendet.

Ich würde die Subnetmask und die eigene IP Adresse auslesen. wenn Du die binär miteinander verknüpfst, dann bekommst Du genau raus welche IP Adressen zu dem Subnet gehören, und kannst die ja dann alle abfragen. Dürften weit weniger als 16 Millionen sein :-D

Christian Seehase 1. Okt 2003 14:04

Re: Subnetzmaske/ Server finden
 
Moin Zusammen,

zu dem Thema hab' ich in diesem Thread
Alle PC-Namen eines Netzwerkes erhalten

mal ein Programm als Attachement angefügt (nur die Sourcen). Müsste auf einer der letzten Seiten sein.

EConvertError 1. Okt 2003 15:52

Re: Subnetzmaske/ Server finden
 
Vielen Dank für eure Hilfe!

Zitat:

Ich würde die Subnetmask und die eigene IP Adresse auslesen. wenn Du die binär miteinander verknüpfst, dann bekommst Du genau raus welche IP Adressen zu dem Subnet gehören, und kannst die ja dann alle abfragen.
Genau das will ich ja machen. Wie man die IP bekommt weiß ich schon, nur wie man das Subnet bekommt (noch) nicht.

Ich werde jetzt mal die Vorschläge von Christian Seehase ausprobieren und hoffen, dass es geht...

mfg,
Andy

Christian Seehase 1. Okt 2003 16:06

Re: Subnetzmaske/ Server finden
 
Moin Andy,

Zitat:

Zitat von EConvertError
Ich werde jetzt mal die Vorschläge von Christian Seehase ausprobieren und hoffen, dass es geht...

wenn Du Dir mal in dem genannten Thread durchliest wozu es gut war, und dass es funktioniert hat, würde es mich wundern, wenn es bei Dir nicht ginge.

EConvertError 22. Okt 2003 18:54

Re: Subnetzmaske/ Server finden
 
Hallo nochmal!

Ich komme mir ein wenig blöd vor, weil ich noch einmal frage, aber:
Das mit dem AdaptersInfo hat bei mir nicht ganz funktioniert.

Wahrscheinlich liegt es an meinem eigenem Unwissen. Denn ich habe es nicht geschafft, die Subnetzmaske auszulesen, bzw. habe ich nur die eigene IP Adresse und irgendeine Maske (der Wert war 0.0.0.0, also definitiv nicht meine Subnetzmaske) herauslesen können.

WNetEnumResource ist, glaube ich, in meinem Fall nicht das Richtige, weil da doch nur die Rechner angezeigt werden, die auch in der Netzwerkumgebung sind. Oder täusche ich mich da?

Vielleicht könntet ihr mir noch einmal helfen?
Vielen Dank schon im voraus,
EConvertError

Christian Seehase 22. Okt 2003 20:21

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

wie hast Du's denn gemacht.
Ein bisschen Source wäre ganz hilfreich.

EConvertError 23. Okt 2003 16:02

Re: Subnetzmaske/ Server finden
 
Ich habe mir den Code von hier genommen: GETADAPTERSINFO

Diese beiden habe ich herauslesen können:

Delphi-Quellcode:
IpAddress : IP_ADDRESS_STRING;
IpMask   : IP_MASK_STRING;
Der Rest war mir nicht wirklich klar (ich bitte um Entschuldigung, aber mir der API habe ich bis jetzt eher weniger gemacht).

Wie gesagt; ich bräuchte die Subnetzmaske (IpMask wars nicht).

mfg
EConvertError

Christian Seehase 23. Okt 2003 16:31

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

Zitat:

Zitat von EConvertError
Wie gesagt; ich bräuchte die Subnetzmaske (IpMask wars nicht).

Im Prinzip schon, aber da wo Gatewaylist steht, muss IpAddressList stehen:

Hier mal die Repeat Until Schleife aus dem Beispiel (die zu ändernden Stellen rot)

Code:
        repeat
          iasWork := pAdapterWork.[color=red]IpAddressList[/color];
          while iasWork.Next <> nil do
          begin
            cobGateway.Items.Add(trim(iasWork.[color=red]IpMask[/color].acString));
            iasWork := iasWork.Next^;
          end;
          cobGateway.Items.Add(trim(iasWork.[color=red]IpMask[/color].acString));
          pAdapterWork := pAdapterWork.Next;
        until pAdapterWork = nil;
Zitat:

Zitat von EConvertError
(ich bitte um Entschuldigung, aber mir der API habe ich bis jetzt eher weniger gemacht).

Kein Problem. Am Besten kannst Du Dich hier mit den Einzelheiten vertraut machen, wenn Du Dir das PSDK herunterlädst, soweit das möglich ist (ca. 350 MB, wenn's komplett sein soll), oder unter msdn.microsoft.com nachschlägst.
Da sind die meisten Dinge genau dokumentiert.
Was jetzt nicht heissen soll, dass Du nicht mehr fragen sollst. Vor allem, wer den Umgang mit dem PSDK nicht gewohnt ist wird manchmal (oft?) Schwierigkeiten haben das passende zu finden.

In diesem Falle kannst Du ja mal sehen, ob Du mit der Dokumentation zu den hier verwendeten Datentypen klarkommst.

EConvertError 26. Okt 2003 16:52

Re: Subnetzmaske/ Server finden
 
Vielen Dank, dass ihr mir immer noch zur Seite steht!

Also ich habe jetzt einmal all das rot Markierte umgeändert, jedoch kommt bei mir eine Fehlermeldung:

Inkompatible Typen: 'IP_ADDR_STRING' und 'PIP_ADAPTER_INFO'

...und das in der folgender Zeile:
Delphi-Quellcode:
iasWork := pAdapterWork.IpAddressList;
Bin schon total verzweifelt! :wall:

mfg,
EConvertError

PS: Beim MSDN hatte ich auch kein Glück.

Christian Seehase 26. Okt 2003 17:13

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

hier noch mal das Original komplett

Code:
const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8;  // arb.

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING =
    packed record
      acString : array [1..16] of Char;
    end;

  PIP_MASK_STRING = ^PIP_MASK_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING =
    packed record
      Next     : PIP_ADDR_STRING;
      IpAddress : IP_ADDRESS_STRING;
      IpMask   : IP_MASK_STRING;
      Context  : DWORD;
    end;

  time_t = int64;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO =
    packed record
      Next               : PIP_ADAPTER_INFO;
      ComboIndex         : DWORD;
      AdapterName        : array [1..MAX_ADAPTER_NAME_LENGTH+4] of Char ;
      Description        : array [1..MAX_ADAPTER_DESCRIPTION_LENGTH+4] of Char;
      AddressLength      : UINT;
      Address            : array [1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
      Index              : DWORD;
      dwType             : UINT;
      DhcpEnabled        : UINT;
      CurrentIpAddress   : PIP_ADDR_STRING;
      IpAddressList      : IP_ADDR_STRING;
      GatewayList        : IP_ADDR_STRING;
      DhcpServer         : IP_ADDR_STRING;
      HaveWins           : Boolean;
      PrimaryWinsServer  : IP_ADDR_STRING;
      SecondaryWinsServer : IP_ADDR_STRING;
      LeaseObtained      : time_t;
      LeaseExpires       : time_t;
    end;

function GetAdaptersInfo(const pAdapterInfo : PIP_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall; external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);

var
  dwResult    : DWORD;
  dwLen       : DWORD;
  pAdapterWork : PIP_ADAPTER_INFO;
  pAdapterList : PIP_ADAPTER_INFO;
  iasWork     : IP_ADDR_STRING;

begin
  pAdapterList := nil;
  dwLen       := 0;
  dwResult    := GetAdaptersInfo(pAdapterList,@dwLen);
  if dwResult = ERROR_BUFFER_OVERFLOW then
  begin
    pAdapterList := AllocMem(dwLen);
    try
      dwResult := GetAdaptersInfo(pAdapterList,@dwLen);
      if dwResult = ERROR_SUCCESS then
      begin
        pAdapterWork := pAdapterList;
        cobGateway.Clear;
        repeat
          ShowMessage(trim(pAdapterWork.Description));
          iasWork := pAdapterWork.GatewayList; [color=red]// auf GatewayList durch IpAddressList austauschen[/color]
          while iasWork.Next <> nil do
          begin
            cobGateway.Items.Add(trim(iasWork.IpAddress.acString)); [color=red]// und hier IpAddress durch IpMask[/color]
            iasWork := iasWork.Next^;
          end;
          cobGateway.Items.Add(trim(iasWork.IpAddress.acString)); [color=red]// hier auch IpAddress durch IpMask tauschen[/color]
          pAdapterWork := pAdapterWork.Next;
        until pAdapterWork = nil;
        if cobGateway.Items.Count > 0 then
        begin
          cobGateway.ItemIndex := 0;
        end;
      end;
    finally
      FreeMem(pAdapterList,dwLen);
    end;
  end;
end;

EConvertError 26. Okt 2003 17:27

Re: Subnetzmaske/ Server finden
 
Vielen Dank, Chris!

Es funktioniert!

Danke noch mal,
EConvertError

Christian Seehase 26. Okt 2003 17:52

Re: Subnetzmaske/ Server finden
 
Moin EConvertError,

prima, aber könntest Du mal sagen, warum es vorher nicht ging.
Da war doch kein Unterschied. :gruebel:

EConvertError 27. Okt 2003 17:18

Re: Subnetzmaske/ Server finden
 
Hi!

Ehrlich gesagt habe ich keine Ahnung. :?:

Zitat:

Da war doch kein Unterschied.
Beim den roten Stellen sicher nicht, aber irgendwo wird dann doch etwas anders gewesen sein. Ich war auch ziemlich verwundert, als es dann funktionierte.
Angesichts der Mathematik- Schularbeit übermorgen werde ich die genaue Überprüfung der beiden Versionen verschieben, und mich einfach nur freuen dass es funktioniert.

Danke noch mal,
EConvertError


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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