如何根據網路內的IP地址得到該機的MAC地址? |
尚未結案
|
billyguo
一般會員 ![]() ![]() 發表:5 回覆:8 積分:2 註冊:2004-03-12 發送簡訊給我 |
|
alphakao
一般會員 ![]() ![]() 發表:0 回覆:18 積分:8 註冊:2002-07-04 發送簡訊給我 |
|
billyguo
一般會員 ![]() ![]() 發表:5 回覆:8 積分:2 註冊:2004-03-12 發送簡訊給我 |
|
bigdogchina
版主 ![]() ![]() ![]() ![]() ![]() 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
Hi,billyguo,您好!
小弟的一點淺見,也許能對您解決問題有所啓迪: 小弟認爲不妨把思路的放到:ARP協定上來。ARP協定是“Address Resolution Protocol”(位址解析協定)的縮寫,它的作用是將IP位元址轉換成物理位址(就是MAC位址),具體的應用將通過IP Helper API中的SendARP()函數來實現。SendARP()是Microsoft Platform SDK中提供用來獲得目標主機的MAC位址的函數,其描述爲:
DWORD SendARP(
IPAddr DestIP,
IPAddr SrcIP,
PULONG pMacAddr,
PULONG PhyAddrLen
);
通過MSDN,可以查詢到:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/sendarp.asp 如需要深入理解和掌握其用法,下面兩篇文章是非常不錯的資料(原理和使用講解的非常清晰明瞭,而且後面還有作者完整的code):
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39046680-1,00.htm
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39050622,00.htm 由於資料的差異,您可能需要自己去將iphlpapi.h轉化爲.pas喲!我到覺得不如用C 實現其功能,做成DLL供Delphi使用!小弟在Delphi下也沒有實做過,純粹亂來的< >。權當一種思路,供您參考< > =================================
人生在勤,不索何獲
業精於勤荒於嬉,行成於思毀於隨
臨淵羡魚不如退而結網
------
人生在勤,不索何获? |
alphakao
一般會員 ![]() ![]() 發表:0 回覆:18 積分:8 註冊:2002-07-04 發送簡訊給我 |
Dos 下的 arp 有 Pipe 的功能
你可以用 winexec 或 shellAPI 去執行 類似 arp -a > c:\arptable.txt
之類的,在去讀 c:\arptable.txt 就可以了,
這種方法不只 Delphi 能用吧?
VB C 都可以
很多你能在 shell 裡面就作完的工作其實真的不用花太多工夫
20 分能作完的事別花到 8 小時 Function GetMAC(IP:String):String;
Function CallShell(CMD,Para:String):Boolean;Stdcall;
var
execinfo:TSHELLEXECUTEINFO;
Begin
fillchar(execinfo,sizeof(execinfo),0);
execinfo.cbsize:=sizeof(execinfo);
execinfo.lpverb:=PChar('open');
execinfo.lpfile:=pchar(CMD);
execinfo.lpparameters:=Pchar(Para);
execinfo.fmask:=SEE_MASK_NOCLOSEPROCESS;
execinfo.nshow:=SW_HIDE;
Result:=shellexecuteex(@execinfo);
waitforsingleobject(execinfo.hprocess,infinite);
End;
var
MyFile:TextFile;
MAC:String;
Data:String;
MyIP,MyMAC:String;
Begin
CallShell('Command','/C Ping -n 1 ' IP);
CallSHell('Command','/C arp -a > c:\ArpTab.txt');
AssignFile(MyFile,'c:\arptab.txt');
Reset(MyFile);
MAC:='';
while (not eof(MyFile)) or (MAC = '') do Begin
readln(MyFile,Data);
MyIP:=Trim(Copy(Data,1,24));
MyMAC:=Copy(Data,25,17);
if Trim(Copy(Data,1,24)) = IP then Begin
MAC:=MyMAC;
End;
end;
CloseFile(MyFile);
deletefile('c:\arptab.txt');
Result:=MAC;
End; 如果你要用 iphelp api Function GetRmtMac(IP:String):String;
var
PMyTable:PMIB_IPNETTABLE;
TableSize:Dword;
RIP:Dword;
i:Integer;
RES:String;
Begin
RES:='';
New(PMyTable);
RIP:=Inet_Addr(PCHAR(IP));
TableSize:=SizeOf(MIB_IPNETTABLE);
GetIpNetTable(PMyTable,TableSize,TRUE);
for i := 0 to PMyTable.dwNumEntries -1 do begin
IF PMyTable^.table[i].dwAddr = RIP then Begin
RES:=IntToHex(PMyTable^.table[i].bPhysAddr[0],2)
IntToHex(PMyTable^.table[i].bPhysAddr[1],2)
IntToHex(PMyTable^.table[i].bPhysAddr[2],2)
IntToHex(PMyTable^.table[i].bPhysAddr[3],2)
IntToHex(PMyTable^.table[i].bPhysAddr[4],2)
IntToHex(PMyTable^.table[i].bPhysAddr[5],2);
Break;
End;
end;
Dispose(PMyTable);
Result:=RES;
end; 但是 Delphi 沒有內建對 iphelp 的定義檔 你要自己上網找 iphelp 的定義
或者 你要自己翻 MSDN 自己定義
|
billyguo
一般會員 ![]() ![]() 發表:5 回覆:8 積分:2 註冊:2004-03-12 發送簡訊給我 |
|
Ktop_Robot
站務副站長 ![]() ![]() 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |