Entwickler-Ecke

Internet / Netzwerk - mac Adresse im Netzwerk auslesen. Rückgabewert erfunden?


pchero - Fr 07.08.09 11:48
Titel: mac Adresse im Netzwerk auslesen. Rückgabewert erfunden?
Hallo

ich habe ein Programm, dieses soll mir die MAC Addresse ausgeben, wenn ich ihm die IP Adresse angebe. Die MAC Adresse kann ich über cmd nachprüfen.

Ich Pinge einen PC an. Der Eintrag steht in der ARP Tabelle Überprüft via arp -a .Aber das Programm gibt mir eine Vollkommen falsche aus.

Ich lass es aber Send ARP laufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Winsock;

const
  iphlpapilib = 'iphlpapi.dll';

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
   { Private declarations }
  public
    { Public declarations }
  end;

function SendArp(ipaddr:ulong;
  temp:dword;
  ulmacaddr:pointer;
  ulmacaddrleng:pointer) : DWord; StdCall;
var
  Form1: TForm1;
implementation

  {$R *.DFM}
function SendARP; external iphlpapilib name 'SendARP';

function GetMacAddr(const IPAddress: string): string;
var
  lDestIP:ulong;
  lMacAddr:array[0..5of byte;
  lPhyAddrLen:ulong;
begin
  lDestIP:=inet_addr(PansiChar(IPAddress));
  lPhyAddrLen:=length(lMacAddr);
  sendarp(lDestIP,0,@lMacAddr, @lPhyAddrLen);
  Result:=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
      [Integer(lMacAddr[0]), Integer(lMacAddr[1]),
      Integer(lMacAddr[2]), Integer(lMacAddr[3]),
      Integer(lMacAddr[4]), Integer(lMacAddr[5])]);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.caption:=GetMacAddr(Edit1.Text);
end;

end.


auch aus Text kann er sich eine MAC Adresse generieren

Gruß PcHeRo


Narses - Fr 07.08.09 12:20

Moin und :welcome: im Forum!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
ich habe ein Programm, dieses soll mir die MAC Addresse ausgeben, wenn ich ihm die IP Adresse angebe.
Schau mal hier [http://www.delphi-forum.de/viewtopic.php?t=81827&highlight=nbtstat], damit solltest du weiter kommen. :les: :think: ;)

cu
Narses


pchero - Fr 07.08.09 12:28

die Versionen kenn ich auch ;)

aber ich wollte es ohne DOS und so machen sondern rein mit Delphi.
Den Befehl nbtstat kannte ich schon klappt bei mir aber Merkwürdigerweise nicht. Er Liefert mir da nie die MAC Adresse zurück. Hingegen ich sie in arp -a sehen kann.

Ganz Falsch kann mein Ansatz ja nicht sein, denn er gibt mir ja eine MAC Adresse aus. Nur Irgendeine Erfundene

Gruß

p.s. Diese Fehlermeldung gibt er beim Compilieren aus:
[DCC Warnung] Unit1.pas(41): W1044 Bedenkliche Typumwandlung von string in PAnsiChar


Narses - Fr 07.08.09 13:18

Moin!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
aber ich wollte es ohne DOS und so machen sondern rein mit Delphi.
Also bei mir klappt das so (1:1-Port des MSDN-Codes, JEDI-Header-Library): :nixweiss:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
function SendARP(const DestIP, SrcIP: in_addr; pMacAddr: PULONG; var PhyAddrLen: ULONG): DWORD; stdcallexternal IPHLPAPILIB name 'SendARP';

function GetMacAddr(const IPv4: String): String;
  const
    SrcIP: in_addr = (S_addr: 0);
  var
    DestIP: in_addr;
    MacAddr: array[0..5of Byte;
    MacAddrLen, RC: DWORD;
    i: Integer;
begin
  Result := '';
  DestIP.S_addr := inet_addr(PChar(IPv4));
  MacAddrLen := Length(MacAddr);
  // http://msdn.microsoft.com/en-us/library/aa366358(VS.85).aspx
  RC := SendARP(DestIP,SrcIP,@MacAddr,MacAddrLen);
  case RC of
    NO_ERROR:
      begin
        if (MacAddrLen = 6then
          for i := 0 to 5 do begin
            if (i > 0then
              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';
    ERROR_NOT_FOUND:
      Result := 'ERROR_NOT_FOUND';
    else
      Result := 'Error: RC='+IntToStr(RC);
  end;
end;
cu
Narses


pchero - Fr 07.08.09 13:39

kann es villeicht daran liegen, das ich immer statt PChar immer PansiChar verwende? Weil er mir sonst immer nur einen Error ausspuckt.

auf der Jedi Seite war ich auch schon und habe nach der einen Lib gesucht. Hab sie aber ned mehr Gefunden und die Links führen ins leere, die man noch so findet.

Was benötigt dein Code denn ? Weil ich seh keinen Großartigen Unterschied zu meinem, in der Art wie er an die MAC adresse kommt

Gruß


Narses - Fr 07.08.09 13:54

Moin!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
kann es villeicht daran liegen, das ich immer statt PChar immer PansiChar verwende? Weil er mir sonst immer nur einen Error ausspuckt.
Was liegt wo ran? :gruebel: Dass du eine zufällige MAC-Adresse geliefert kriegst, wird wohl damit zusammen hängen, dass die Funktion einen Fehler meldet, den du nicht auswertest (und dann den nicht initialisierten Speicher als MAC liest). Was hat das jetzt mit Compiler-Fehlern zu tun? Ich dachte, dein Code läuft, liefert aber Unsinn. :nixweiss: Wo liegt denn jetzt genau dein Problem? :?!?:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Was benötigt dein Code denn ?
Wenn du die Fehlertextauflösung auf die letzte Zeile reduzierst und den ErrorCode einfach numerisch ausgibst, dann nur WinSock.

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Weil ich seh keinen Großartigen Unterschied zu meinem, in der Art wie er an die MAC adresse kommt
Oh doch, ich sehe da einen ziemlich Großen - du wertest das Funktionsergebnis nicht aus. ;) (und ich habe den Funktionsheader etwas anders deklariert)

cu
Narses


Delete - Fr 07.08.09 14:03

Guck mal hier: http://www.michael-puff.de/Artikel/GetMAC.shtml


pchero - Fr 07.08.09 14:04

Zitat:

:gruebel: Dass du eine zufällige MAC-Adresse geliefert kriegst, wird wohl damit zusammen hängen, dass die Funktion einen Fehler meldet, den du nicht auswertest (und dann den nicht initialisierten Speicher als MAC liest).

achso okay stimmt daran hatte ich garnicht gedacht. Ich hatte jetzt an sowas gedacht, das er die Adresse durch das ersetzen von PChar zu PAnsiChar falsch übergeben bekommt.

also ich habe deinen Code bei mir jetzt mal eingefügt. Egal Welche IP Adresse ich eingebe es kommt immer:
ERROR_GEN_FAILURE bei raus.
Zitat:
A device attached to the system is not functioning. This error is returned on Windows Server 2003 and earlier when an ARP reply to the SendARP request was not received. This error can occur if destination IPv4 address could not be reached because it is not on the same subnet or the destination computer is not operating.


Obwohl ich diesen Fehler nicht Nachvollziehen kann, denn ansonsten kann ich über ARP -a die mac sehen. Oder läuft das nochmal anders ab?

Gruß PcHeRo


Delete - Fr 07.08.09 14:17

Und was sagt mein Programm?


pchero - Fr 07.08.09 14:24

Das Programm klappt.


Narses - Fr 07.08.09 14:36

Moin!

Na, wenn wir schonmal dabei sind, kannst du ja auch gleich nochmal meins ausprobieren [http://www.delphi-forum.de/viewtopic.php?t=94099]. ;)

cu
Narses


Delete - Fr 07.08.09 21:06

Stimmt sogar mit meinem überein. ;) Aber meins ist kleiner. 8)


pchero - Mo 10.08.09 09:02

Hallo

hab das Problem gelöst bekommen Fehler war Unicode und doch das mit dem Pansichar


Delphi-Quelltext
1:
DestIP.S_addr := inet_addr(PAnsichar(AnsiString(IPv4)));                    


Kompliziert;)

Danke für die Hilfen =)

Gruß