如何获取本机的物理IP地址???(100分)

  • 主题发起人 主题发起人 hqq1497
  • 开始时间 开始时间
H

hqq1497

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获取本机的物理IP地址?????
谢谢了呀??
 
//获取本机的IP地址
function get_ip: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;
IP:string;
begin
try
WSAStartup($101,GInitData);
IP:='0.0.0.0';
GetHostName(Buffer,SizeOf(Buffer));
phe:=GetHostByName(Buffer);
if phe=nil then
begin
// showmessage(IP);
exit;
end;
pptr:=PaPInAddr(phe^.h_addr_list);
i:=0;
while pptr^<>nil do
begin
IP:=inet_ntoa(pptr^^);
inc(i);
end;
WSACleanup;
get_ip:=IP; //如果上网则为上网ip否则是网卡ip
finally
end;
end;
 
一台机器可能有多个IP!
需要引用WinSock2.pas单元,这个单元可以在网上下载。

//当前机的所有IP地址
function TMainForm.get_ActiveIP: TStringDynArray;
type
TaPInAddr = Array[0..20] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
begin
setlength(Result, 20);

GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if (phe = nil) then
begin
setlength(Result, 0);
ShowMessage('没有找到可绑定的IP!');
exit;
end;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while (pPtr^ <> nil) and (i < 20) do
begin
Result:=inet_ntoa(pptr^^);
Inc(I);
end;
setlength(Result , i);
end;
 
是物理IP地址啊~~~
 
那里有什么 物理IP地址哦? 是物理地址吧?
用MiTeC System Information Component Suite 控件 网上下载吧!
 
是MAC地址吧 嘿嘿那不叫物理 IP地址 叫物理地址 MAC。
 
楼上的函数取出的是内网IP
 
得到MAC地址的
function MacAddress: string;
var
Lib: Cardinal;
Func : function(GUID: PGUID): Longint; stdcall;
GUID1, GUID2: TGUID;
begin
Result := '';
Lib := LoadLibrary('rpcrt4.dll');
if Lib <> 0 then
begin
if Win32Platform <>VER_PLATFORM_WIN32_NT then
@Func := GetProcAddress(Lib, 'UuidCreate')
else @Func := GetProcAddress(Lib, 'UuidCreateSequential');
if Assigned(Func) then
begin
if (Func(@GUID1) = 0) and
(Func(@GUID2) = 0) and
(GUID1.D4[2] = GUID2.D4[2]) and
(GUID1.D4[3] = GUID2.D4[3]) and
(GUID1.D4[4] = GUID2.D4[4]) and
(GUID1.D4[5] = GUID2.D4[5]) and
(GUID1.D4[6] = GUID2.D4[6]) and
(GUID1.D4[7] = GUID2.D4[7]) then
begin
Result :=
IntToHex(GUID1.D4[2], 2) + '-' +
IntToHex(GUID1.D4[3], 2) + '-' +
IntToHex(GUID1.D4[4], 2) + '-' +
IntToHex(GUID1.D4[5], 2) + '-' +
IntToHex(GUID1.D4[6], 2) + '-' +
IntToHex(GUID1.D4[7], 2);
end;
end;
FreeLibrary(Lib);
end;
end;
 
To xiammy:
你说的情况,调用Windows自身的API就可以,不需要你那样,Windows下面有一个IPHLPAPI.DLL用这里面的API就可以获取IP的各种信息了,包括你说的多个IP
 
function GetLocalIP(MultIP:boolean=false):String;
type PPInAddr= ^PInAddr;//取本机IP,可取多个(分行列出)
var
wsaData: TWSAData;
HostInfo: PHostEnt;
HostName: Array[0..255] of Char;
Addr: PPInAddr;
begin
Result:='';
if WSAStartup($0101, wsaData)<>0 then exit;
try
if gethostname(HostName, SizeOf(HostName)) <> 0 then exit;
HostInfo:= gethostbyname(HostName);
if HostInfo=nil then Exit;
Addr:=Pointer(HostInfo^.h_addr_list);
if (Addr=nil) or (Addr^=nil) then exit;
Result:=StrPas(inet_ntoa(Addr^^));
inc(Addr);
while (Addr^<>nil)and MultIP do begin
Result:=Result+^M^J+StrPas(inet_ntoa(Addr^^));
inc(Addr);
end;
finally
WSACleanup;
end;
end;
 
function GetHostNameAndIP(var hostName:string;var hostIP:string):boolean;
var
wVersionRequested : WORD;
wsaData : TWSAData;
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
begin
{启动 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);

{计算机名}
GetHostName(@s, 128);
p := GetHostByName(@s);
hostName := strPas(p^.h_Name);
//ShowMessage(Format('Computer name is ''%s''.', [p^.h_Name]));

{IP地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
hostIP := strPas(p2);
//ShowMessage(Format('IP address is %s.',[p2]));

WSACleanup;
end;
 
您知道超级格子是什么吗?买格子就是买“房子”! 购买格子后,可以在会员中心管理自己的格子,自行修改图片和链接地址,在有效期内还可以出租或者转让,炒格子也赚钱! 详情请见http://www.51dz.com/g.asp?i=zauden
 
上面的代码一点用也没有,我试过,都是内网IP,还有一个是网卡标识
 
后退
顶部