Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IP-ADAPTER_ADDRESS Structure (https://www.delphipraxis.net/124189-ip-adapter_address-structure.html)

sx2008 9. Dez 2008 09:01

Re: IP-ADAPTER_ADDRESS Structure
 
Zitat:

Zitat von quendolineDD
Aber ich hab ja nicht umsonst die API-Deklarationen mir vorgenommen um schlussletztlich die JEDI Units zu nutzen. Sicherlich sind diese in ihrer Form und Ausprägung dem Nutzen nach besser und effektiver, jedoch mache ich mir den Aufwand bewusst um gewisse Zusammenhänge zu verstehen und auch an sich zu lernen.

Ja klar, man sollte nur rechtzeitig aufhören, bevor die Umsetzung von C nach Pascal zur Quälerei wird.
Der Lerneffekt müsste ja inzwischen vorhanden sein.
Die mechanische Umsetzung macht nicht wirklich Spass; wenn man die API benützen kann allerdings schon.

Zitat:

Zitat von quendolineDD
Aber die Klasse TAdapter macht in dem Sinne nichts weiter, als die Werte der Adapter "verbraucherfreundlich" zu präsentieren.

Genau so sollte es ja sein. Du wirst aber eher zwei Klassen brauchen (TAdapter=Info über einen konkreten Adapter , TAdapterList=Liste aller vorh. Adapter)

quendolineDD 9. Dez 2008 13:41

Re: IP-ADAPTER_ADDRESS Structure
 
Ja, das war ein Fehler in meinen Überlegungen und wäre mir bei weiterer Verwendung auch noch ausgebessert wurden.

Zitat:

Der Lerneffekt müsste ja inzwischen vorhanden sein.
In der Tat. Ich will mir nun auch erstmal in den Jedi-Komponenten die Einbindung dessen anschauen. Ob ich dann selber noch Klassen um die Jedi machen muss, weiß ich nicht. Ein Großteil ist ja selber schon in Klassen gefasst.

Trotzdem fand ich immer noch nicht, in welcher Struktur nun die IP des Adapters gespeichert ist? Wird diese mit in SOCKADDR unter sa_data abgelegt und von mir nur falsch Interpretiert? Bisher hab ich darin keine sinnvoll zu verwendenden Daten gefunden. Auch Sprach die iSockAddrLength nicht unbedingt dafür. Family repräsentiert mit Sicherheit wieder den Typ Ipv4 bzw. Ipv6.

CodeX 20. Mär 2009 16:24

Re: IP-ADAPTER_ADDRESS Structure
 
Zitat:

Zitat von quendolineDD
Trotzdem fand ich immer noch nicht, in welcher Struktur nun die IP des Adapters gespeichert ist? Wird diese mit in SOCKADDR unter sa_data abgelegt und von mir nur falsch Interpretiert? Bisher hab ich darin keine sinnvoll zu verwendenden Daten gefunden.

Hast Du eine Lösung gefunden?

Wenn ich mir das Beispiel hier anschaue, wird das in C so gemacht:
Code:
//Check if the address family is IPV4
if (sockaddr.sa_family == (Int32)System.Net.Sockets.AddressFamily.InterNetwork)
{
    ipaddr = new IPAddress(sockaddr.sa_data);
}
else if (sockaddr.sa_family == (Int32)System.Net.Sockets.AddressFamily.InterNetworkV6)
{
    //Marshal memory pointer into a struct
    sockaddripv6 = (SOCKADDRIPV6)Marshal.PtrToStructure(sock_addr.lpSockAddr, typeof(SOCKADDRIPV6));
    ipaddr = new IPAddress(sockaddripv6.sa_data);
}
Was ich damit aber in Delphi mache, weiß ich leider nicht.

quendolineDD 20. Mär 2009 17:48

Re: IP-ADAPTER_ADDRESS Structure
 
Der Code ist C#
Habe die Übersetzung aufgegeben gehabt und selber mit der JwaIpHlpApi weiter gearbeitet. Obwohl ich eher selber zu C#-Programmierung tendiere als mit Delphi zu arbeiten.

Schau dir mal das hier an. Da steht die Enumeration für das AddressFamily.
Die (Int32)... davor ist ein Typecast in Delphi.

Damit du mit dem Quelltext arbeiten kannst, müsstest du extremst viel Arbeit investieren, was sich meiner Meinung nach auch damals nicht lohnte.
Aus ipaddr = new IPAddress(sockaddr.sa_data); wird zum Bsp. in Delphi ipaddr := IPAddress.Create (sockaddr.sa_data); usw.

Viel Spaß noch dabei :)

CodeX 20. Mär 2009 20:01

Re: IP-ADAPTER_ADDRESS Structure
 
Naja, es geht mir ja in erster Linie sa_data in einer lesbaren Form zu erhalten. Da steht aber (wie Du oben schon geschrieben hattest) nur irgendein Quatsch drin. Schade, dass Du da nicht weiter gemacht hast. Weiß vielleicht sonst jemand, was falsch ist bzw. was noch gemacht werden muss, damit da die Adressen anzeigbar sind?

CodeX 21. Mär 2009 14:18

Re: IP-ADAPTER_ADDRESS Structure
 
Ich muss doch nochmal konkreter nachfragen.

So sieht mein Code-Ausschnitt zum Auslesen der Adressen aus (Aufs Nötigste zurechtgekürzt, aber zum Nachvollziehen, sollte das ausreichend sein):
Delphi-Quellcode:
var
adapter, a : PIP_ADAPTER_ADDRESSES;
BUFFER, ERROR : DWORD;
UnicastAddress : PIP_ADAPTER_UNICAST_ADDRESS;

begin
  ERROR := GetAdaptersAddresses(0, 0, nil, nil, @buffer);
  if error <> ERROR_BUFFER_OVERFLOW then
    ShowMessage('Memory');

  adapter := AllocMem(buffer);
  ERROR := GetAdaptersAddresses(0, 0, nil, adapter, @buffer);

  if ERROR = ERROR_SUCCESS then
  begin
    a := adapter;

    while a <> nil do
    begin
      Memo1.Lines.Add(a.FriendlyName);

      UnicastAddress := a.FirstUnicastAddress;
      while UnicastAddress <> nil do
      begin
        Memo1.Lines.Add('[' + UnicastAddress.Address.lpSockaddr.sa_data + ']');
        UnicastAddress := UnicastAddress.Next;
      end;
    end;

  end;
Die Ausgabe von sa_data bringt nichts lesbares zum Vorschein. Wenn ich es debugge, steht sowas wie (#0, #0, #0, #0, #0, #0, ' ', #1, #13, '¸', '…', '£', #8, 'Ó') drin.

Woran liegt das?

quendolineDD 21. Mär 2009 16:30

Re: IP-ADAPTER_ADDRESS Structure
 
Also Intellisense (Visual Studio 2008) will ein Bytearray haben, welches die IP-Addresse erhlät. Schuast du hier. Mit C# hab ich es halt einfach, weil alles schon enthalten ist ;-)

Musst du mal von Byte zu String umrechnen und schauen, was rauskommt ;-) Garantieren kann ich jedenfalls nichts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr.
Seite 2 von 2     12   

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