Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi MAC-Adresse zu einer IP Adresse ermitteln (https://www.delphipraxis.net/142295-mac-adresse-zu-einer-ip-adresse-ermitteln.html)

CG2003 25. Okt 2009 20:40

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Das ist die Funktion:

Code:
uses IPHlpAPI, WinSock;


function IPToMAC(IP: String) : String;
var
  DestIP, SrcIP: Cardinal;
  pMacAddr: PULong;
  AddrLen: ULong;
  MacAddr: array[0..5] of byte;
  p: PByte;
  i: integer;
begin
  result := '';
  SrcIp := 0;
  DestIP := inet_addr(PChar(IP));
  pMacAddr := @MacAddr[0];
  AddrLen := SizeOf(MacAddr);
  SendARP(DestIP, SrcIP, pMacAddr, AddrLen);
  p := PByte(pMacAddr);
  if Assigned(p) and (AddrLen>0) then
  for i := 0 to AddrLen-1 do
  begin
    result := result + IntToHex(p^,2) + '-';
    Inc(p);
  end;
  SetLength(result, Length(result) - 1);
end;
Weiterhin habe ich die Unit "IPHLPAPI.PAS" verwendet, die auch hier zu finden ist.

CG2003 25. Okt 2009 21:31

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Sorry, für Doppelpost, aber kann es sein, dass AddrLen immer 0 ist und er deshalb nichts ausgibt?
Ich habe mir mal innerhalb der Funktion mittels

Delphi-Quellcode:
ShowMessage(IntToStr(AddrLen));
versucht mir den Wert von AddrLen anzeigen zu lassen und er gibt mir immer 0 aus. Aber wieso?

CG2003 26. Okt 2009 06:42

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
So, ich nutze jetzt folgende Funktion und hier bekomme ich den Fehler zurück, dass MacAddrLen 0 ist. Woran kann das liegen?

Delphi-Quellcode:
function SendARP(const DestIP, SrcIP: in_addr; pMacAddr: PULONG; var PhyAddrLen: ULONG): DWORD; stdcall; external 'IPHLPAPI.DLL' name 'SendARP';

function GetMacAddr(const IPv4: String): String;
  const
    SrcIP: in_addr = (S_addr: 0);
  var
    DestIP: in_addr;
    MacAddr: array[0..5] of Byte;
    MacAddrLen, RC: DWORD;
    i: Integer;
begin
  Result := '';
  DestIP.S_addr := inet_addr(PAnsiChar(AnsiString(IPv4)));
  MacAddrLen := Length(MacAddr);
  // msdn.microsoft.com/e...aa366358(VS.85).aspx
  RC := SendARP(DestIP,SrcIP,@MacAddr,MacAddrLen);
  case RC of
    NO_ERROR:
      begin
        if (MacAddrLen = 6) then
          for i := 0 to 5 do begin
            if (i > 0) then
              Result := Result +'-';
            Result := Result +IntToHex(MacAddr[i],2);
          end
        else
          Result := 'Error: MacAddrLen='+IntToStr(MacAddrLen);
      end;
    ERROR_GEN_FAILURE:
      Result := 'ERROR_GEN_FAILURE';
    ERROR_INVALID_PARAMETER:
      Result := 'ERROR_INVALID_PARAMETER';
    ERROR_INVALID_USER_BUFFER:
      Result := 'ERROR_INVALID_USER_BUFFER';
    ERROR_BAD_NET_NAME:
      Result := 'ERROR_BAD_NET_NAME';
    ERROR_BUFFER_OVERFLOW:
      Result := 'ERROR_BUFFER_OVERFLOW';
    else
      Result := 'Error: RC='+IntToStr(RC);
  end;
end;
Im Programm lass ich mir die MAC-Adresse mit

Delphi-Quellcode:
LabelBlaBla.Caption := GetMacAddr(IPAdresse);
Wobei IPAdresse vom Typ String ist und eine IP-Adresse eines Remote-Hosts beinhaltet.
Selbst ein LabelBlaBla.Caption := GetMacAddr(AnsiString(IPAdresse)); brachte nicht den gewünschten Erfolg.

fkerber 26. Okt 2009 07:19

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Hi!

Bitte vermeide für die Zukunft Doppel- oder gar Triple-Postings innerhalb von 24 Stunden. Während diesr Zeit kannst du immer noch Informationen an deinen bestehenden Beitrag anhängen (durch Editieren).

Es wäre auch schön, wenn du in deinem obigen Beitrag die Code-Tags durch Delphi-Tags ersetzen würdest, damit der Code besser lesbar wird.


Zum Thema:
Wo kommt dieser "Fehler" denn? Ich kann bei dir jetzt keine Fehlerausgabe finden, die diesen Text enthält.


Grüße, Frederic

generic 26. Okt 2009 08:28

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Die Mac Adresse kannst du nur ermitteln, wenn du lokale IP Adressen verwendest. Die Mac z.B. von einem entfernten Server kannst du nicht ermitteln!

mh166 26. Okt 2009 13:47

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Zitat:

Zitat von generic
Die Mac Adresse kannst du nur ermitteln, wenn du lokale IP Adressen verwendest. Die Mac z.B. von einem entfernten Server kannst du nicht ermitteln!

Das ist so nicht ganz richtig. Wenn der entfernte Rechner im gleichen Subnet ist, dann wäre es möglich. Hier mach ichs meistens so, dass ich die Ziel-IP anpinge und anschließend den ARP-Cache auslese. Im selben Subnetz wird ja bekanntlich nichts geroutet und der Rechner kümmert sich daher selbst um die Auflösung der IP-Adresse via ARP.

Sollte der entfernte Rechner allerdings in einem anderen Subnet stehen, dann läuft die ganze Geschichte natürlich über einen Router. Der löst dann für dich die IP (soweit bekannt) auf und du bekommst daher nix davon mit.

mfg, mh166

CG2003 26. Okt 2009 16:45

Re: MAC-Adresse zu einer IP Adresse ermitteln
 
Jupp, über die VPN-Verbindung hatte das bisher in Delphi 2007 und Windows Vista einwandfrei funktioniert. Nur in Delphi 2009 und Windows 7 nicht mehr. Warum weiß ich noch nicht.
Mache ich es allerdings in der Firma direkt im Netz geht's, über VPN nicht.


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

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz