如何藉由查詢MAC address而得到其IP address ? |
尚未結案
|
kensoong
初階會員 發表:31 回覆:70 積分:45 註冊:2003-05-28 發送簡訊給我 |
|
leo2568
中階會員 發表:54 回覆:124 積分:70 註冊:2003-09-21 發送簡訊給我 |
引言: 各位先進與前輩: 請教一個位題... 如何藉由查詢MAC address而得到其IP address ? 反方向又如何? Uses NB30 function TForm1.GetMACAdress: string; var NCB : PNCB; Adapter : PAdapterStatus; URetCode : PChar; RetCode : char; I : integer; Lenum : PlanaEnum; _SystemID : string; TMPSTR : string; begin Result := ''; _SystemID := ''; Getmem(NCB, SizeOf(TNCB)); Fillchar(NCB^, SizeOf(TNCB), 0); Getmem(Lenum, SizeOf(TLanaEnum)); Fillchar(Lenum^, SizeOf(TLanaEnum), 0); Getmem(Adapter, SizeOf(TAdapterStatus)); Fillchar(Adapter^, SizeOf(TAdapterStatus), 0); Lenum.Length := chr(0); NCB.ncb_command := chr(NCBENUM); NCB.ncb_buffer := Pointer(Lenum); NCB.ncb_length := SizeOf(Lenum); RetCode := Netbios(NCB); i := 0; repeat Fillchar(NCB^, SizeOf(TNCB), 0); Ncb.ncb_command := chr(NCBRESET); Ncb.ncb_lana_num := lenum.lana[I]; RetCode := Netbios(Ncb); Fillchar(NCB^, SizeOf(TNCB), 0); Ncb.ncb_command := chr(NCBASTAT); Ncb.ncb_lana_num := lenum.lana[I]; Ncb.ncb_callname := '* '; Ncb.ncb_buffer := Pointer(Adapter); Ncb.ncb_length := SizeOf(TAdapterStatus); RetCode := Netbios(Ncb); if (RetCode = chr(0)) or (RetCode = chr(6)) then begin _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) '-' IntToHex(Ord(Adapter.adapter_address[1]), 2) '-' IntToHex(Ord(Adapter.adapter_address[2]), 2) '-' IntToHex(Ord(Adapter.adapter_address[3]), 2) '-' IntToHex(Ord(Adapter.adapter_address[4]), 2) '-' IntToHex(Ord(Adapter.adapter_address[5]), 2); end; Inc(i); until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00'); FreeMem(NCB); FreeMem(Adapter); FreeMem(Lenum); GetMacAdress := _SystemID; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin label1.Caption := GetMACAdress; end;╭╧╮╭╧╮╭╧╮╭╧╮╭╮☆ ║聖│║誕│║快│║樂│ ╰☆╮ ╘∞╛╘∞╛╘∞╛╘∞╛☆╰☆ . ﹒☆‧☆∴.:☆﹒‧∴ ☆..... |
kensoong
初階會員 發表:31 回覆:70 積分:45 註冊:2003-05-28 發送簡訊給我 |
|
leo2568
中階會員 發表:54 回覆:124 積分:70 註冊:2003-09-21 發送簡訊給我 |
|
kensoong
初階會員 發表:31 回覆:70 積分:45 註冊:2003-05-28 發送簡訊給我 |
Sorry, you misunderstand what I mean... PS:I coded PASCAL & Delpi programs for many many years... Is NB30 a standard component (built-in) in Delphi ?
And your answer is getting MAC address from IP...not IP from MAC address. Following post also the same result for MAC address...
unit MaunUnt;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, NB30, Dialogs, StdCtrls; type TMainFmt = class(TForm) Label1: TLabel; edMAC: TLabel; ComboBox1: TComboBox; btnGetMac: TButton; Label2: TLabel; btnResetMAC: TButton; procedure FormCreate(Sender: TObject); procedure btnGetMacClick(Sender: TObject); procedure btnResetMACClick(Sender: TObject); private { Private declarations } public { Public declarations } end;var MainFmt: TMainFmt;implementation{$R *.dfm}type TNBLanaResources = (lrAlloc, lrFree);type PMACAddress = ^TMACAddress; TMACAddress = array[0..5] of Byte;function GetLanaEnum(LanaEnum: PLanaEnum): Byte;var LanaEnumNCB: PNCB;begin New(LanaEnumNCB); ZeroMemory(LanaEnumNCB, SizeOf(TNCB)); try with LanaEnumNCB^ do begin ncb_buffer := PChar(LanaEnum); ncb_length := SizeOf(TLanaEnum); ncb_command := Char(NCBENUM); NetBios(LanaEnumNCB); Result := Byte(ncb_cmd_cplt); end; finally Dispose(LanaEnumNCB); end;end;function ResetLana(LanaNum, ReqSessions, ReqNames: Byte; LanaRes: TNBLanaResources): Byte;var ResetNCB: PNCB;begin New(ResetNCB); ZeroMemory(ResetNCB, SizeOf(TNCB)); try with ResetNCB^ do begin ncb_lana_num := Char(LanaNum); // Set Lana_Num ncb_lsn := Char(LanaRes); // Allocation of new resources ncb_callname[0] := Char(ReqSessions); // Query of max sessions ncb_callname[1] := #0; // Query of max NCBs (default) ncb_callname[2] := Char(ReqNames); // Query of max names ncb_callname[3] := #0; // Query of use NAME_NUMBER_1 ncb_command := Char(NCBRESET); NetBios(ResetNCB); Result := Byte(ncb_cmd_cplt); end; finally Dispose(ResetNCB); end;end;function GetMACAddress(LanaNum: Byte; MACAddress: PMACAddress): Byte;var AdapterStatus: PAdapterStatus; StatNCB: PNCB;begin New(StatNCB); ZeroMemory(StatNCB, SizeOf(TNCB)); StatNCB.ncb_length := SizeOf(TAdapterStatus) 255 * SizeOf(TNameBuffer); GetMem(AdapterStatus, StatNCB.ncb_length); try with StatNCB^ do begin ZeroMemory(MACAddress, SizeOf(TMACAddress)); ncb_buffer := PChar(AdapterStatus); ncb_callname := '* ' #0; ncb_lana_num := Char(LanaNum); ncb_command := Char(NCBASTAT); NetBios(StatNCB); Result := Byte(ncb_cmd_cplt); if Result = NRC_GOODRET then MoveMemory(MACAddress, AdapterStatus, SizeOf(TMACAddress)); end; finally FreeMem(AdapterStatus); Dispose(StatNCB); end;end;procedure TMainFmt.FormCreate(Sender: TObject);var LanaEnum: PLanaEnum; I: Integer;begin New(LanaEnum); ZeroMemory(LanaEnum, SizeOf(TLanaEnum)); try if GetLanaEnum(LanaEnum) = NRC_GOODRET then begin with ComboBox1, Items do begin Sorted := True; BeginUpdate; Clear; for I := 0 to Byte(LanaEnum.length) - 1 do Add(IntToStr(Byte(LanaEnum.lana[I]))); ItemIndex := 0; EndUpdate; end; end; finally Dispose(LanaEnum); end;// ResetButton.Enabled := (Win32Platform = VER_PLATFORM_WIN32_NT);end;procedure TMainFmt.btnGetMacClick(Sender: TObject);var LanaNum: Byte; MACAddress: PMACAddress; RetCode: Byte;begin LanaNum := StrToInt(ComboBox1.Text);//********** MODIFY ********** RetCode := ResetLana(LanaNum, 0, 0, lrAlloc); if RetCode <> NRC_GOODRET then begin Beep; ShowMessage('Reset Error! RetCode = $' IntToHex(RetCode, 2)); end;//**************************** New(MACAddress); try if RetCode = NRC_GOODRET then begin edMAC.Caption := Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x', [MACAddress[0], MACAddress[1], MACAddress[2], MACAddress[3], MACAddress[4], MACAddress[5]]); end else begin Beep; edMAC.Caption := 'Error'; ShowMessage('GetMACAddress Error! RetCode = $' IntToHex(RetCode, 2)); end; finally Dispose(MACAddress); end;end;procedure TMainFmt.btnResetMACClick(Sender: TObject);var RetCode: Byte; LanaNum: Byte;begin LanaNum := StrToInt(ComboBox1.Text); RetCode := ResetLana(LanaNum, 0, 0, lrAlloc); if RetCode <> NRC_GOODRET then begin Beep; ShowMessage('Reset Error! RetCode = $' IntToHex(RetCode, 2)); end;end;end.
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
Hi!kensoong您好!
請參考一下:
IP Address--->MAC Address 1)VC版
http://www.pcvc.net/category/content.asp?sendid=229 2)Delphi版
http://users.pandora.be/sonal.nv/ics/faq/General.html#MacaddressofaNIC18 ===================================
Example 2: const INADDR_NONE = $FFFFFFFF; function SendARP( const DestIP : DWord; const SrcIP : DWord; const pMacAddr : Pointer; const PhyAddrLen : PULONG) : DWord; stdcall; external 'IPHLPAPI.DLL' name 'SendARP'; function inet_addr(const cp : PChar) : DWord; stdcall; external 'WS2_32.DLL' name 'inet_addr'; var dwResult : DWord; ulIPAddr : DWord; ulMACAddr : Array [0..5] of Byte; ulAddrLen : ULONG; begin ulIPAddr := inet_addr(PChar('192.168.1.1')); ShowMessage(IntToHex(ulIPAddr,8)); // Ist mal interessant zu sehen if ulIPAddr = INADDR_NONE exit; ulAddrLen := 6; dwResult := SendARP(ulIPAddr,0,@ulMACAddr,@ulAddrLen); ShowMessage('dwResult: ' IntToStr(dwResult)); // if 0, then ok ShowMessage(IntToHex(ulMACAddr[0],2) ':' IntToHex(ulMACAddr[1],2) ':' IntToHex(ulMACAddr[2],2) ':' IntToHex(ulMACAddr[3],2) ':' IntToHex(ulMACAddr[4],2) ':' IntToHex(ulMACAddr[5],2)); end; |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |