发信人: leezy (【HIT】穆子), 信区: BorlandDev
标 题: 获取本机动态IP地址
发信站: 哈工大紫丁香 (2002年01月19日15:51:14 星期六), 站内信件
摘 要:拨号连入Internet的服务器为了将自己的动态位置告诉正
关键字:IP地址 WinSock
类 别:网络
获取本机IP地址需要调用Windows Sockets过程函数,Windows Sockets函数定义在
DELPHI的WinSock单元。
通过使用WinSock的gethostname函数可获得本机的名称,再根据获得的本机名称调
用gethostbyname函数可返回指向有关本机信息的指针,该指针及其指向的主机信息结构
定义如下:
type
PHostEnt = ^THostEnt;
hostent = record
h_name: PChar;
h_aliases: ^PChar;
h_addrtype: Smallint;
h_length: Smallint;
case Byte of
0: (h_addr_list: ^PChar);
1: (h_addr: ^PChar)
end;
THostEnt = hostent;
其中的h_addr_list就是本机所有IP地址的列表,其每一元素就是一个指向IP地址的
指针,并以空指针nil为列表结束标志。而h_addr则是为了向前兼容而保留的数据项,已
不再使用。
拨号上网方式连入Internet的主机,可能存在两个IP地址,第一个是本地局域网网
卡的IP地址,另一个则是ISP动态分配给拨号主机的IP地址。一般来说,如果h_addr_li
st中有两个以上IP地址,则最后一个就是拨入Internet的动态IP地址。
下面的GetLastIP函数可实现对动态IP地址的获取:
function GetLastIP:string;
var
WSAData:TWSAData;
HostName:array[0..MAX_COMPUTERNAME_LENGTH] of Char;
HostEnt:PHostEnt;
LastIP:PInAddr;
IPList:^PInAddr;
begin
result:='';
if 0=WSAStartup(MAKEWORD(1,1), WSAData) then
try
if 0=gethostname(HostName, MAX_COMPUTERNAME_LENGTH+1) then
begin
HostEnt:=gethostbyname(HostName);
if HostEnt<>nil then
begin
IPList:=Pointer(HostEnt^.h_addr_list);
repeat
LastIP:=IPList^;
INC(IPList);
until IPList^=nil;
if LastIP<>nil then
result:=inet_ntoa(LastIP^);
end;
end;
finally
WSACleanup;
end;
end;
此函数实际是获取最后一个IP地址的字符串,一般是拨号后动态分配的IP地址。如
果,主机还未拨号上网,则返回的是本地局域网的IP地址,所以,在运行服务器程序之
前,要先完成拨号网络的连接步骤。该函数在任何错误的情况下将返回空字符串,其中
的try…finally结构保证在任何情况下都可释放分配的Windows Sockets资源(牢记编程
的基本原则)。
在此要注意,使用Windows单元的GetComputerName也可获得本机的名称,但其获得
的名称可能会与gethostname函数获得的名称有所不同。虽然,在大多数情况下GetComp
uterName获得得机器名称也可以使用,不过,还是用gethostname函数更好些。喜欢探索
Windows注册表的朋友可以发现,gethostname函数返回的是HKEY_LOCAL_MACHINE \Syst
em \CurrentControlSet \Services \VxD \MSTCP路径的HostName,而GetComputerName
函数返回的是HKEY_LOCAL_MACHINE \System \CurrentControlSet \Control \Computer
Name \ComputerName路径的ComputerName。
李战 授权转载
--
°★.☆° .★·°∴°★.°·∴°☆ ·°∴° ☆..·°∴°.☆°★°∴°
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.230.122]
※ 修改:·leezy 於 01月19日18:40:37 修改本文·[FROM: 202.118.230.122]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.996毫秒