如何获得本机登录到internet的ip (100分)

  • 主题发起人 主题发起人 autumn
  • 开始时间 开始时间
A

autumn

Unregistered / Unconfirmed
GUEST, unregistred user!
局域网的充当proxy的机器
os:win2k server
proxy:ISA
网卡数:>2 最少一张连LAN,一张连INTERNET...

问题:如何获得那张网卡登陆到INTERNET的地址?
 
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=NMHTTP1.LocalIP;
end;
 
猫兄你得到的是本地Lan的地址,我要的是internet的ip地址
 
下面的过程可以列举你机器的所有IP地址,当然也包括Lan和Internet,使用方法:
用语句Memo1.Lines.Add('本机IP地址:'+LocalIP);就可以
//返回本机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
if i=0
then result:=StrPas(inet_ntoa(pptr^^))
else result:=result+','+StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
 
光子:
确实是将我所有的ip都搞出来了,但是我怎样区分他们,
我只要自己的当前internet连接的ip地址阿。
 
方法1:(难题留给系统的路由程序)
加一个 NMHTTP 控件,连接 www.sina.com.cn 为了节省时间,只是得到文件头Head.
NMHttp.LocalIp 应该是连接 InterNet 的网卡的IP.
方法2:检索系统路由表(了解DOS 的Route print 命令吗?)
 
>加一个 NMHTTP 控件,连接 www.sina.com.cn 为了节省时间,只是得到文件头Head.
>NMHttp.LocalIp 应该是连接 InterNet 的网卡的IP.
代码:
...
  nmhttp1.Head(Edit1.Text);
  memo1.Text:=  nmhttp1.Header;
  button2.Caption:=nmhttp1.LocalIP;
...
返回的还是我的lan的ip
 
我的另外一个想法:
1> ipconfig>a.txt
2> 检索a.txt
...
PPP adapter Connection through Realtek RTL8139(A) PCI Fast Ethernet Adapter:



Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 61.144.96.120
...
在这里就是了[:D]
 
tianhf:
>方法2:检索系统路由表(了解DOS 的Route print 命令吗?)
不是很会,是否类似上边我的方法
 
去问左轻候去。
 
给国际时钟服务器发一个包,或者随便ping哪个一下
返回包里隐藏着你的IP
 
我的网卡绑了PPPoE协议连接ADSL,一块网卡就有两个地址!
查的时候还要从IP包中取网卡的 MAC 地址啊!
 
use ....winsock;
procedure TForm1.ButtonIPClick(Sender: TObject);
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
Screen.Cursor := crHourGlass;
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;
ShowMessage(IP);//如果上网则为上网ip否则是网卡ip
finally
Screen.Cursor := crDefault;
end;
end;

 
谢谢大家。yangerpeng给了正确的答案,所以我将所有的分数给他了,大家没有意见吧[:D]
 
接受答案了.
 
不知道autumn是否看懂了代码的意思,yangerpeng的代码明显是光子代码的翻版!
while pPtr^ <> nil do
begin
IP := inet_ntoa(pptr^^);
Inc(I);
end;
不过是取最后一个IP给你看,想想如果你有3块网卡,第2块上网,yangerpeng
给的代码就有可能显示第3块网卡的IP了。

[:(!]分给的如此草率,光子可真冤!
 
  我不晓得你拿那个Internet的IP有什么用途,也许有更简单办法解决。否则要识别哪个
IP地址是登录Internet的,我有一个思路:
  ★检测哪些IP在在Internet上是合法的,这样可以排除127、192等等,万一你的
LAN IP也设置为合法Internet地址我就没有办法了,不过那样你的本地应用在上网后肯定会
影响,可能上网后LAN里面的机器无法访问。
 
谢谢OopsWare的提醒。
向光子致歉。

我实际应用是这样的:
adsl proxy 是24小时开着的,但由于是动态的ip,所以不能用http://61.140.190.45的访问
方法。我就设想申请一个免费的主页空间,在adsl proxy上运行一个服务,定期监测一下自己
的ip地址,如果变了就通知免费主页里的a.xml,用户就直接指向免费主页里的ocx,然后ocx根据
a.xml重定向到adsl proxy。实现数据交换。
以前曾记得有一个小的软件是可以将域名和动态ip绑定一起的。就是申请一个域名,安装那个
软件,然后设定要使用的域名,然后将他运行在后台。那么客户只要访问域名,就能动态的连接
到我的adsl proxy了。但是我现在找不会那个软件了.

分数好商量
 
提到分就见外了![^]

实际上我对Proxy的工作原理还不是很清除,但试想一下:
将固定IP(1)绑定到网卡(1)上,自动获取的IP(2)绑定到网卡(2)上。用PPPoE拨号
连接Internet,此时网卡(2)上得到一个IP地址例如 218.58.14.217。因为W2K更改
IP不需要重起计算机,将网卡(1)上的IP也改为218.58.14.217(不知是否可行,
我的计算机只有一块网卡)。不管你使用哪个软件,包括ipconfig,都得到了同样
的IP,你说哪个上网了?
如此看来,tianhf的方法1,未尝不是一个好办法![:D]
 
顺便提一句,ADSL带宽下行虽然可到8M,但上行只有800k,好像不适合作Web服务啊!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部