如何得到目前机器"在Internet上的IP"? ( 积分: 10 )

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

fongling5355

Unregistered / Unconfirmed
GUEST, unregistred user!
如何得到目前机器"在Internet上的IP"?
 
如何得到目前机器"在Internet上的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
result:=StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
========================================
program get_ip;
uses
winsock,sysutils;
VAR
ch : ARRAY[1..32] OF Char;
i : Integer;
WSData: TWSAData;
MyHost: PHostEnt;
begin
IF WSAstartup(2,wsdata)<>0 THEN
BEGIN
Writeln('can''t start Winsock: Error ',WSAGetLastError);
Halt(2);
END;
try
IF getHostName(@ch[1],32)<>0 THEN
BEGIN
Writeln('getHostName failed');
Halt(3);
END;
except
Writeln('getHostName failed');
halt(3);
end;
MyHost:=GetHostByName(@ch[1]);
IF MyHost=NIL THEN
BEGIN
Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error
'+IntToStr(WSAGetLastError));
Halt(4);
END
ELSE
BEGIN
Write('address ');
FOR i:=1 TO 4 DO
BEGIN
Write(Ord(MyHost.h_addr^[i-1]));
IF i<4 THEN
then write('.')
ELSE
writeln;
END;
END;
end.
===========================================
 
有时得到的不是真正www的ip,纳闷
 
用Indy中的IdIPWatch就可以了
事例:
showmessage(IdIPWatch1.LocalIP);
 
各位,如果是局域网通过另处一台电脑上网时,如何办?应考虑。
 
如果是通过路由或者代理上网。。。这个就麻烦了。。。
看看这个帖子吧。。。。虽然最后也没结果。。。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2380553
 
另外,使用tracert命令也可以。。。。。
比如:

tracert www.163.com 一般第一个是你的IP,如果是内网。。。第2个是第一个网关,也就是局域网的上层路由,一般这个就应该是公网IP了

所以可以这样:tracert www.163.com -h 2
先判断第一个是否属于内网IP段,如果不是,就取第2个,否则取第一个

至于如何判断为内网IP:

以下列出留用的内部私有地址
A类 10.0.0.0--10.255.255.255
B类 172.16.0.0--172.31.255.255
C类 192.168.0.0--192.168.255.255
 
请多提共

路由或局域网通过另处一台电脑上网的资料, 谢谢!
 
indy 中的ipwatcher
 
使用RAS函数
 
请问如何编程得到外网IP 不是LOCALIP

var
IPAddr : String;
begin
IPAddr := RasGetIPAddress;
if IPAddr > '' then
InfoListBox.Items.Add('IP=' + IPAddr)
else
InfoListBox.Items.Add('IP unknown');
end;



我的方法是,直接访问一个能取得外网IP的页面
在Form1上放一个TNMHTTP
uses inInet
procedure TFrmMain.Button11Click(Sender: TObject);
begin
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
begin
NMHTTP1.Get('http://www.bliao.com:2000/ip.phtml');
LocalIP.Text := NMHTTP1.Body;
LoginInfo.IPAddr := LocalIP.Text;
AdoTbl2.Edit;
AdoTbl2['LocalIP'] := LocalIP.Text;
AdoTbl2.Post;
LocalIP.SetFocus;
LocalIP.SelectAll;
end
else
MessageDlg('您还没有连接到因特网!', mtInformation, [mbOK], 0);
end;
 
访问外网,让其告诉你
 
后退
顶部