如何在Delphi中获取内网和外网IP ( 积分: 200 )

  • 主题发起人 主题发起人 oy_bin
  • 开始时间 开始时间
O

oy_bin

Unregistered / Unconfirmed
GUEST, unregistred user!
1.如何在Delphi中获取IP地址,内部和外部的
2.当服务器重新拨号了,如何获取?
 
1.如何在Delphi中获取IP地址,内部和外部的
2.当服务器重新拨号了,如何获取?
 
我也想知道
 
两个问题其实核心是同一个问题,内部IP是很容易获得的,就是外网IP目前没有很好的解决办法,唯一实用的是通过网页返回自己的外网IP。
 
如果通过网页返回自己的外网IP?
 
在windows有个指令叫 IPConfig可以看到外网IP,所以我觉得应该是有办法的
 
自己写里个函数
function GetIP:String;
var
WSData: TWSAData;
Buffer: array[0..63] of Char;
HostEnt: PHostEnt;
PPInAddr: ^PInAddr;
IPString: String;
begin
IPString:='';
try
WSAStartUp($101, WSData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt:=GetHostByName(Buffer);
if Assigned(HostEnt) then
begin
PPInAddr:=@(PInAddr(HostEnt.H_Addr_List^));
while Assigned(PPInAddr^) do
begin
IPString:=StrPas(INet_NToA(PPInAddr^^));
Inc(PPInAddr);
end;
end;
Result := IPString;
finally
try
WSACleanUp;
except
end;
end;
end;
 
vincent-hu的办法可以取内网IP,外网的不行的
 
先要明白内网外网的区别——如果我们的定义不同的话,是没有再讨论的意义了:
我所指的外网IP是指电信为我们提供的动态IP,即每次拨号后动态分配给我们的IP;
内网IP是指ADSL之后通过集线器或交换机等设备建立的局域网所分配给各台电脑的IP。
 
如果你用IPConfig可以看到外网IP,那么你用vincent-hu的办法就行了,因为你根本就是直接上网,不存在内网与外网的问题。
 
我有一段代码,可以取本机的内外网IP(对局域网而言,应放在服务器上):
//uses WinSock
function GetIP(sHostName: String): Tstrings;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array[0..MAX_PATH-1] of char;
i : integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := TStringList.Create;
Result.Clear;
if sHostName = '' then //若为空值, 则取本机的hostname
begin
GetHostName(Buffer, sizeof(Buffer));
sHostName := String(Buffer);
end;
phe := GetHostByName(PChar(sHostName));
if phe = nil then Exit;
pptr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pptr^ <> nil do
begin
Result.Add(StrPas(inet_ntoa(pptr^^)));
Inc(i);
end;
WSACleanup;
// Result.Free;
end;
不过,如何直接在客户端取服务器的外网地址我还真不知道,要不在服务器放个小的服务器工具?
如果不需要编程,则可直接连到某些可以看到IP的网站就可以看到外网IP了。
 
对,就是lhc4000理解的
而且获取外网的IP才是最关键的
 
那如果不在拨号的服务器,上面的函数能获取吗
上面的函数返回的是一IP地址集合,我任何判断哪个是我所需要的呢?
 
后退
顶部