送你一个函数: function GetMacADDR(IPstr:string):string; label Fend; var DestIP:IPAddr; pMacAddr: PULong; AddrLen: ULong; MacAddr: array[0..5] of byte; p: PByte; s: string; i: integer; SendARP:PSendARP; HM:Thandle; begin Result:=''; hm := loadlibrary('iphlpapi.dll'); if hm = 0 then goto Fend; SendARP := getprocaddress(hm, 'SendARP'); if @SendARP=nil then goto Fend ; DestIP := inet_addr(PChar(IPstr)); pMacAddr := @MacAddr[0]; AddrLen := SizeOf(MacAddr); SendARP(DestIP, 0, pMacAddr, AddrLen); p := PByte(pMacAddr); if Assigned(p) and (AddrLen>0) then for i := 0 to AddrLen-1 do begin s := s + IntToHex(p^,2) + '-'; Inc(p); end; SetLength(s, length(s)-1); Result:=s; Fend: FreeLibrary(hm); end; 别忘了给分哟!
如果在Win2K里就更简单了,一个函数SendARP()就可以搞定。
to:yezq_ln:关键是IP协议以经把这个地址给丢了!
那我就说点
现在的网卡都有自动拆包的功能,你等网卡自动拆包后,你已经得不到MAC地址
所有你首先要控制网卡别自动拆包,你来拆,不过写程序是很烦的
一般的网卡都有自己的缓存,所以你要直接去读网卡的缓存,得到包,然后解析出mac
function GetMacADDR(IPstr:string):string;
label Fend;
var
DestIP:IPAddr;
pMacAddr: PULong;
AddrLen: ULong;
MacAddr: array[0..5] of byte;
p: PByte;
s: string;
i: integer;
SendARP:PSendARP;
HM:Thandle;
begin
Result:='';
hm := loadlibrary('iphlpapi.dll');
if hm = 0 then goto Fend;
SendARP := getprocaddress(hm, 'SendARP');
if @SendARP=nil then goto Fend ;
DestIP := inet_addr(PChar(IPstr));
pMacAddr := @MacAddr[0];
AddrLen := SizeOf(MacAddr);
SendARP(DestIP, 0, pMacAddr, AddrLen);
p := PByte(pMacAddr);
if Assigned(p) and (AddrLen>0) then
for i := 0 to AddrLen-1 do
begin
s := s + IntToHex(p^,2) + '-';
Inc(p);
end;
SetLength(s, length(s)-1);
Result:=s;
Fend:
FreeLibrary(hm);
end;
别忘了给分哟!
我当然知道数据包中有Mac地址,要不网卡怎么知道该收哪个包,但那是在链路层(帧)上。
在Winsock中,最多只提供到网络层(IP)的访问,所以只有IP地址。
如果要访问链路层,恐怕只能用VXD,WDM了。这点在Linux里实现就很简单。
哪儿有真正的高手?
如果是,局域网的话可以通过,ip -> mac 解析我以前,做过这样的 一个程序源程序要找一下了 !
谢谢,可以给我找一找吗
或者给一下思路