我回来了,大散分~,同时问几个问题,呵呵:)(300分)

  • 主题发起人 阿西喊佛
  • 开始时间

阿西喊佛

Unregistered / Unconfirmed
GUEST, unregistred user!
好久没来了,给大家一些礼物,同时也问几个问题,呵呵,知者不难:)
1 如何获得网卡物理地址
2 如何获得本机IP地址
3 如何获得本机计算机名
4 如何从IP地址得到计算机名
5 如何从计算机名得到IP地址
6 如何通过网卡物理地址获得IP地址和计算机名
7 如何通过IP地址或计算机名获得网卡物理地址
(要求在Win2000 Server下 D6或D7能通过)
(以上要求全部用函数实现,不读取注册表)
(答对前面3道者给100分,答全者200分,其他100当散分!)
(这个星期解决!)
(UP有分~!)
 
http://www.playicq.com/datanew/delphi网络通信协议.rar
 
1 网卡:
uses
NB30;

function GetAdapterInfo(Adapter_num: Char; var AMac_Addr: string): Boolean;
type
TStat = record
Adapt: TAdapterStatus;
Name_Buffer: TNameBuffer;
end;
var
P: PNCB;
Adapter: TStat;
Temp: Char;
begin
New(P);
try
// 重置网卡,以便我们可以查询
FillChar(P^, SizeOf(TNcb), #0);
P^.ncb_command := Chr(NCBRESET);
P^.ncb_lana_num := adapter_num;
Temp := Netbios(P);
if Temp <> Chr(NRC_GOODRET) then
begin
AMac_Addr := 'bad (NCBRESET): ' + P^.Ncb_retcode;
Result := False;
Exit;
end;
FillChar(P^, SizeOf(TNcb), #0);
P^.ncb_command := Chr(NCBASTAT);
P^.ncb_lana_num := Adapter_num;
P^.ncb_callname := '*';
FillChar(Adapter, SizeOf(TStat), #0);
P^.ncb_buffer := @Adapter;
P^.ncb_length := Sizeof(Adapter);
// 取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。
Temp := Netbios(P);
if Temp = #0 then
begin
AMac_Addr := Format('%0.2x:%0.2x:%0.2x:%0.2x:%0.2x:%0.2x', [Ord(Adapter.adapt.adapter_address[0]),
Ord(Adapter.adapt.adapter_address[1]), Ord(Adapter.adapt.adapter_address[2]),
Ord(Adapter.adapt.adapter_address[3]), Ord(Adapter.adapt.adapter_address[4]),
Ord(Adapter.adapt.adapter_address[5])]);
end;
finally
Dispose(P);
end;
Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
AdapterList: TLanaEnum;
Ncb: PNcb;
I: Integer;
Mac_addr: string;
begin
New(Ncb);
try
// 取得网卡列表
FillChar(Ncb^, SizeOf(TNcb), #0);
FillChar(AdapterList, Sizeof(AdapterList), #0);
Ncb.ncb_command := Chr(NCBENUM);
Ncb.ncb_buffer := @AdapterList;
Ncb.ncb_length := Sizeof(AdapterList);
Netbios(Ncb);
for I := 0 to Ord(AdapterList.Length) - 1 do
begin
if GetAdapterInfo(AdapterList.lana, Mac_addr) then
Memo1.Lines.Add(Format('Adapter %d''s MAC is %s', [Ord(AdapterList.lana), Mac_addr]))
else
begin
Memo1.Lines.Add('Failed to get MAC address! Do you have the NetBIOS protocol installed?');
Break;
end;
end;
finally
Dispose(Ncb);
end;
end;

end.
 
希望给出源码,在这个帖子里面给出!
 
2 本机 ip
function LocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
if i=0
then result:=StrPas(inet_ntoa(pptr^^))
else result:=result+','+StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
 
to 人在昆明
得出答案为:
Adapter 8's MAC is 68:1B:20:52:41:53
Adapter 7's MAC is 66:90:20:52:41:53
Adapter 6's MAC is 66:90:20:52:41:53
Adapter 0's MAC is 00:50:EB:08:00:B2
Adapter 3's MAC is 00:50:EB:08:00:B2
请解释结果~!
 
function GetSelfComputerName:string;
var
aComputerName: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;
Size: cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH+1;
if GetComputerName(aComputerName, Size) then
Result:= aComputerName;
end;
 
{=================================================================
功 能: 返回本机的局域网Ip地址
参 数: 无
返回值: 成功: True, 并填充LocalIp 失败: False
备 注:
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
function GetLocalIP(var LocalIp: string): Boolean;
var
HostEnt: PHostEnt;
Ip: string;
addr: pchar;
Buffer: array [0..63] of char;
GInitData: TWSADATA;
begin
Result := False;
try
WSAStartup(2, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt := GetHostByName(buffer);
if HostEnt = nil then Exit;
addr := HostEnt^.h_addr_list^;
ip := Format('%d.%d.%d.%d', [byte(addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
LocalIp := Ip;
Result := True;
finally
WSACleanup;
end;
end;

{=================================================================
功 能: 通过Ip返回机器名
参 数:
IpAddr: 想要得到名字的Ip
返回值: 成功: 机器名 失败: ''
备 注:
inet_addr function converts a string containing an Internet
Protocol dotted address into an in_addr.
版 本:
1.0 2002/10/02 22:09:00
=================================================================}
function GetNameByIPAddr(IPAddr : String;var MacName:String): Boolean;
var
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
begin
Result := False;
if IpAddr = '' then exit;
try
WSAStartup(2, WSAData);
SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
if HostEnt <> nil then
MacName := StrPas(Hostent^.h_name);
Result := True;
finally
WSACleanup;
end;
end;

{=================================================================
功 能: 判断Ip协议有没有安装
参 数: 无
返回值: 成功: True 失败: False;
备 注: 该函数还有问题
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
Function IsIPInstalled : boolean;
var
WSData: TWSAData;
ProtoEnt: PProtoEnt;
begin
Result := True;
try
if WSAStartup(2,WSData) = 0 then
begin
ProtoEnt := GetProtoByName('IP');
if ProtoEnt = nil then
Result := False
end;
finally
WSACleanup;
end;
end;


{=================================================================
功 能: 列举所有网络类型
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:54:00
=================================================================}
Function GetNetList(var List: Tstringlist): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
p: TNetResourceArray;
Buf: Pointer;
i: SmallInt;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWORD;
begin
Result := False;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//执行失败
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//记录各个网络类型的信息
begin
List.Add(p^.lpRemoteName);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
if Res <> NO_ERROR then exit; //执行失败
Result := True;
FreeMem(Buf); //释放内存
end;

{=================================================================
功 能: 映射网络驱动器
参 数:
NetPath: 想要映射的网络路径
Password: 访问密码
Localpath 本地路径
返回值: 成功: True 失败: False;
备 注:
版 本:
1.0 2002/10/03 09:24:00
=================================================================}
Function NetAddConnection(NetPath: Pchar; PassWord: Pchar
;LocalPath: Pchar): Boolean;
var
Res: Dword;
begin
Result := False;
Res := WNetAddConnection(NetPath,Password,LocalPath);
if Res <> No_Error then exit;
Result := True;
end;

 
ip==>>机器名
function GetComputerNameFromIP(IP:string):string;
var
HostEnt:pHostEnt;
WSAData:TWSADATA;
Addr:DWORD;
begin
WSAStartup($101, WSAData);
Addr:=inet_addr(PChar(IP));
HostEnt:=gethostbyaddr(@Addr,sizeof(Addr),PF_INET);
Result:=HostEnt.h_name;
WSACleanup();
end;
机器名==>>ip
function GetIPFromName(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end
end;
 
6,我想不出来
7,转载,不知道对不对。
我已经实现了这个功能,不过是局域网、2000下,调用iphlpapi.dll中的sendarp函数
function SendARP(DestIP:ipaddr;SrcIP:ipaddr;pMacAddr:pulong;PhyAddrLen:pulong):DWORD;
stdCall; external 'IPHLPAPI.DLL'

其中注意:
type
ipaddr = longint;
pulong = ^u_long;
然后源码如下:



unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
procedure getmacbyip(const ipaddress: WideString;
var macaddress, status: OleVariant);
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Tform1.getmacbyip(const ipaddress: WideString;
var macaddress, status: OleVariant);
var
destip:integer;
pmacaddr:pulong;
addrlen:u_long;
macaddr: array [1..6] of byte;
p:pbyte;
s:string;
i:integer;
ipstr:string;
begin
IPstr := IPaddress;

DestIP := inet_addr(pchar(IPstr));
pMacAddr := pulong(@MacAddr);
AddrLen := sizeof(MacAddr);
if SendARP(DestIP, 0, pMacAddr, @AddrLen) = 0 then
begin
s := '';
p :=pbyte(pMacAddr);
if ((p<>nil) and (AddrLen>0)) then
begin
for i := 1 to AddrLen do
begin
s := s + IntToHex(p^,2) + '-';
p := Pointer(Integer(p)+SizeOf(Byte));
end;
SetLength(s,Length(s)-1);
end;
end;
macaddress:=s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
status,macaddr:eek:levariant;
begin
getmacbyip(edit1.Text,macaddr,status);
label1.Caption:=macaddr;
end;

end.

希望能有所帮助.
 
另外问一下 我有多少分,300太少啦,哈哈!
 
to 人在昆明
得出答案为:
Adapter 8's MAC is 68:1B:20:52:41:53
Adapter 7's MAC is 66:90:20:52:41:53
Adapter 6's MAC is 66:90:20:52:41:53
Adapter 0's MAC is 00:50:EB:08:00:B2
Adapter 3's MAC is 00:50:EB:08:00:B2
请解释结果~!
 
to 人在昆明
Adapter 8's MAC is 68:1B:20:52:41:53
Adapter 7's MAC is 66:90:20:52:41:53
Adapter 6's MAC is 66:90:20:52:41:53
Adapter 0's MAC is 00:50:EB:08:00:B2
Adapter 3's MAC is 00:50:EB:08:00:B2
那块才是我网卡的物理地址!?
 
网卡地址 我看看,刚才没有测试
最多 10分钟
 
OK
等你~!
 
吃饭去啦,下午。
 
快点哦。
要尽快给我哦。
给完我后我就结了~!~
 

Similar threads

回复
0
查看
697
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部