网卡的物理地址(100分)

  • 主题发起人 主题发起人 谭俊峰
  • 开始时间 开始时间

谭俊峰

Unregistered / Unconfirmed
GUEST, unregistred user!
如何根据对方的IP地址获得其相应的网卡的物理地址,
以及自己的网卡的物理地址。
 
对方位于局域网内还是INTERNET上?
 
获得自己的网卡物理地址容易
function TForm1.Getmac:string;
var
ncb : TNCB;
s:string;
adapt : TASTAT;
lanaEnum : TLanaEnum;
i, j, m : integer;
strPart, strMac : string;
begin
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := SizeOf(TLanaEnum);
s:=Netbios(@ncb);
for i := 0 to integer(lanaEnum.length)-1 do
begin
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBReset);
ncb.ncb_lana_num := lanaEnum.lana;
Netbios(@ncb);
Netbios(@ncb);
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Chr(NCBAstat);
ncb.ncb_lana_num := lanaEnum.lana;
ncb.ncb_callname := '* ';
ncb.ncb_buffer := PChar(@adapt);
ncb.ncb_length := SizeOf(TASTAT);
m:=0;
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
m:=1;
if m=1 then
begin
if Netbios(@ncb) = Chr(0) then
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
end;
SetLength(strMac, Length(strMac)-1);
end;
if m=0 then
if Netbios(@ncb) <> Chr(0) then
begin
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
end;
SetLength(strMac, Length(strMac)-1);
end;
end;
result:=strmac;
end;
 
To:Schiesser
局域网
 
arp只能是本网内的
 
To:terry_lzs
ncb : TNCB;是干什么的,需要引用什么单元。
To:g622
arp :是什么?
 
arp地址转换协议,你如果不想看书,在命令行试一下就知道了
 
to 谭俊峰:
对不起,是我没有写清楚,要引用nb30单元
 
还有要定义类型
type
PASTAT = ^TASTAT;
TASTAT = record
adapter : TAdapterStatus;
name_buf : TNameBuffer;
end;
 
谢谢terry_lzs,获得自己的网卡的物理地址的问题终于通过。
不过获得对方网卡物理地址的方法还望各位告知。
我看了一下Tcp/IP的通信协议,网卡物理地址是被绑定在包里的,
是否能通过包把地址取出来。



 
我看了一下arp的命令,它可以根据IP地址查询其对应网卡的物理地址,
这个功能能否通过Api函数得到呢?
 
接受答案了.
 
用kylix怎么获得呢?
 
后退
顶部