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 public 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..5] of 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
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!
pchero hat folgendes geschrieben : |
| 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; stdcall; external IPHLPAPILIB 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(PChar(IPv4)); MacAddrLen := Length(MacAddr); 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'; 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!
pchero hat folgendes geschrieben : |
| 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? :?!?:
pchero hat folgendes geschrieben : |
| 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.
pchero hat folgendes geschrieben : |
| 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
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.
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ß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!