如何取得动态IP地址(200分)

  • 主题发起人 主题发起人 f_inter
  • 开始时间 开始时间
F

f_inter

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么取得动态IP地址?一种是电脑通过ADSL上网的动态IP地址.另外一种是通过服务器上网的服务器的动态IP地址.
 
function getip():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;
getip:=ip;
ShowMessage(IP);//如果上网则为上网ip否则是网卡ip
finally
end;
end;
 
这个我也有。 不过,不行.取得的还是我的本机IP地址
 
type
HRASCONN = DWORD;//拨号连接句柄的类型
RASCONN = record//活动的拨号连接的句柄和设置信息
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为SizeOf(RASCONN)
hrasconn : HRASCONN;//活动连接的句柄
szEntryName : array[0..RAS_MaxEntryName] of char;//活动连接的名称
szDeviceType : array[0..RAS_MaxDeviceType] of char;//活动连接的所用的设备类型
szDeviceName : array[0..RAS_MaxDeviceName] of char;//活动连接的所用的设备名称
end;

TRASPPPIP = record//活动的拨号连接的动态IP地址信息
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为SizeOf(TRASPPPIP)
dwError : DWORD;//错误类型标识符
szIpAddress : array[ 0..RAS_MaxIpAddress ] of char;//活动的拨号连接的IP地址
end;

function GetDynDns:string; //得到拨号网络的动态IP
const
MaxConnections = 10;//假设最多有10个活动的拨号连接
var
connections : array[0..MaxConnections-1] of RASCONN; //拨号连接数组
longSize : dword;
intAvailabelConnections : dword; //活动的拨号连接的实际数目
intIndex : integer;
strTemp : string;
dwResult : DWORD;
dwSize : DWORD;
RASpppIP : TRASPPPIP; //活动的拨号连接的动态IP地址信息
begin
Result :='';
connections[ 0 ].dwSize := sizeof(RASCONN);
longSize := MaxConnections * connections[ 0 ].dwSize;//接收活动连接的缓冲区大小
intAvailabelConnections := 0;//获取所有活动的拨号连接的信息(连接句柄和设置信息)
dwResult := RasEnumConnections( connections[ 0 ],longSize,intAvailabelConnections );
for intIndex := 0 to intAvailabelConnections - 1 do
begin
dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := dwSize;
dwResult := RASGetProjectionInfo( connections[ intIndex ].hRasConn,RASP_PppIp,
RasPPPIP,dwSize);//获取动态IP地址
if dwResult <> 0 then
exit
else
Result:= StrPas(RASpppIP.szIPAddress);
end;
end;
 
自己电脑拨号取IP好象是有办法取.但是,怎么取通过服务器或者路由器拨号上网的动态IP地址
 
可以向域名服务器发一个get请求,服务器自动返回你的IP
 
能告诉我代码怎么写不?这个我不懂耶
 
gzhwfl,的方法是对的,你是没有办法不通过外界来获得外网IP
 
那是不是说,通过路由器或者服务器上网时.是没办法取到出口IP了?
 
楼主何不使用command的方式调用命令行的ipconfig来获得:
通过这种方式可以输出到一个文本文件,然后写个程序解析即可得到



由于工作原因,很久没到DFW上来了,在此,先向各位同仁们表示歉意,也欢迎大家到我的小屋里坐坐,交流交流心得,相互学习,共同进步!
http://122259695.qzone.qq.com
 
得到的是服务器的IP不是出口IP
 
Program MyIP;
{$APPTYPE CONSOLE}
Uses
WinSock;
Var
wsaData : TWSAData;
Begin
WSAStartup( 257, wsaData );
WriteLn( 'Host: ', GetHostByName( NIL )^.h_name );
Write ( 'IP : ', iNet_ntoa( PInAddr( GetHostByName( NIL )^.h_addr_list^ )^ ) );
WSACleanup;
End.
 
取得的还是本机IP.
 
接受答案了.
 
后退
顶部