如何由Ip获得网卡物理地址,局域网的。(80分)

小芮

Unregistered / Unconfirmed
GUEST, unregistred user!
最好用API实现,应该不难,但以前的帖子答案不全。
 
终于给我发现了
nbtstat -a xxx.xxx.xxx.xxx
重定向然后读出来就OK了。

不过能用API实现吗?
 
Function NBGetAdapterAddress(a:integer) : String;
Implementation

{$R *.DFM}

Procedure TForm1.Button1Click(Sender : TObject);
Begin
label1.Caption:=NBGetAdapterAddress(StrtoInt(Edit1.Text));
End;

Function NBGetAdapterAddress(a:Integer) : String;
Var

NCB : TNCB; // Netbios control block file://NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量

Begin
// Initialize
Result := '';

Try
// Zero control blocl
ZeroMemory(@NCB, SizeOf(NCB));

// Issue enum command
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);

// Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB);

// Convert it to string
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[in
tIdx]),2);
Result := strTemp;
Finally
End;
End;

给分吧
 
我把IPMAN改成控件了
 
我要一个!
mail:liutan500@sina.com
 
我要一个IPMAN控件,谢谢!!
mail:liutan500@sina.com
 
iie: 给我一个 PLWang_2000@263.net thanks
 
arp -a

再看一下Borland/Delphi5/Source/Rtl/Win/nb30.pas
 
系统自带的命令就可以看得到啊
 
iie,能给我一个吗?zt70@163.net
 
如果用命令行的话,可用ARP命令.
如果编程的话,可调用IPHLPAPI.DLL中的SENDARP即可,我自己就编了一个基于局域网的程序,可以
批量PING,获取网卡MAC地址。
 
以前的帖子有,自己查去。很简单的,调api就可以了
 
iie: 给我一份,谢了

zjlcc@yeah.net
 
我也要:fwcf@163.net
 
我也要API的例子。
haipeng@cmmail.com
 
很简单,windows自带命令的:
ping xxx.xxx.xxx.xxx
arp -a
就可以得到这个ip的网卡地址了
 
iie:控件我也要一个,谢谢!
wjlsir@21cn.com
 
iie: 控件大概还没完成吧?
 
Tp:fu_xiang_yu
IP 地址是如何输入,为什么我总得到的是本机的MAC???
 
用NB30,如果没有插网线,则不参取得网卡地址:
可以使用下面的代码,插不插网线都可以取得MAC,不过只能在 windows2000下才能使用:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Const
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;

type
PIPAdapterInfo = ^TIPAdapterInfo;
TIPAdapterInfo = Record // IP_ADAPTER_INFO

Next : PIPAdapterInfo;
ComboIndex : Integer;
AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char;
Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
AddressLength : Integer;
Address : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
End;

Function GetAdaptersInfo(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;
StdCall; External 'iphlpapi.dll' Name 'GetAdaptersInfo';

//此函数为核心函数
function GetAdapterInformation():string;
Var
AI,Work : PIPAdapterInfo;
Size : Integer;
Res : Integer;
I : Integer;

Function MACToStr(ByteArr : PByte; Len : Integer) : String;
Begin
Result := '';
While (Len > 0) do Begin
Result := Result+IntToHex(ByteArr^,2)+'-';
ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
Dec(Len);
End;
SetLength(Result,Length(Result)-1); { remove last dash }
End;

begin
Size := 5120;
GetMem(AI,Size);
Res := GetAdaptersInfo(AI,Size);
If (Res <> ERROR_SUCCESS) Then Begin
SetLastError(Res);
RaiseLastWin32Error;
End;
Begin
Work := AI;
I := 1;
Repeat
GetAdapterInformation:=MACToStr(@Work^.Address,Work^.AddressLength);
//上面的代码是将网卡地址送给窗口的标题
Inc(I);
Work := Work^.Next;
Until (Work = nil);
End;
FreeMem(AI);
end; //此函数为核心函数

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Caption:=GetAdapterInformation;
end;

end.
 
顶部