我们一般都看的看内网的IP和自己主机的IP,但是如何查看路由器外网的IP地址 ?(90分)

  • 主题发起人 主题发起人 一条明
  • 开始时间 开始时间

一条明

Unregistered / Unconfirmed
GUEST, unregistred user!
我们一般都看的看内网的IP和自己主机的IP,但是如何查看路由器外网的IP地址 ?
 
你可以这样得到。使用内网的计算机往外部网络的计算机发送一个数据包,不管是TCP还是UDP都可以,里面会包含路由器外网的IP地址。
 
访问外部的网页,让网页返回.
 
别人的代码,刚才测试了。很好用。
unit Functions;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

function CheckInternetOnline: boolean; //检查互联网是否在线
function IsIP(S: string): boolean; //判断录入的字符串是否为IP
function GetLocalIP: string; //获取本机IP地址
function GetTheInternetLocalIP: string; //获取外网IP地址


implementation

uses
GetInternetLocalIP,WinInet,Winsock;

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

function CheckInternetOnline: boolean; //检查互联网是否在线
var
ConnectState: DWORD;
StateSize: DWORD;
begin
ConnectState := 0;
StateSize := SizeOf(ConnectState);
Result := false;
//Use WinInet.pas;
if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then
Result := (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2;
if Result then
Result := InternetCheckConnection('http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome', 1, 0);
end;

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
function IsIP(S: string): boolean; //判断录入的字符串是否为IP
var
S1, S2, S3, S4, sTemp: string;
K, I: integer;
begin
S1 := '';
S2 := '';
S3 := '';
S4 := '';
K := 0;
Result := false;
S := Trim(S);
if Length(S) < 7 then exit; //最小的IP长度也是7位0.0.0.0
for I := 0 to Length(S) do
if S = '.' then
Inc(K);
if K <> 3 then
begin
Result := false;
exit;
end
else
begin
sTemp := S;
for I := Length(sTemp) downto 1 do
if sTemp = '.' then
Delete(sTemp, I, 1);
for I := Length(sTemp) downto 1 do
if not (sTemp in ['0'..'9']) then
begin
Result := false;
exit;
end;
K := Pos('.', S);
S1 := Copy(S, 1, K - 1);
Delete(S, 1, K);
K := Pos('.', S);
S2 := Copy(S, 1, K - 1);
Delete(S, 1, K);
K := Pos('.', S);
S3 := Copy(S, 1, K - 1);
Delete(S, 1, K);
S4 := S;
Result := (StrToInt(S1) >= 0) and (StrToInt(S1) <= 255) and
(StrToInt(S2) >= 0) and (StrToInt(S2) <= 255) and
(StrToInt(S3) >= 0) and (StrToInt(S3) <= 255) and
(StrToInt(S4) >= 0) and (StrToInt(S4) <= 255);
end;
end;
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

function GetLocalIP: string; //获取本机IP地址
type
TaPInAddr = array[0..255] of PInAddr; //Use Winsock.pas
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 not assigned(phe) then
exit;
pptr := PaPInAddr(Phe^.h_addr_list);
i := 0;
while pptr^ <> nil do
begin
result := Result + StrPas(inet_ntoa(pptr^^)) + ',';
inc(i);
end;
Delete(Result, Length(Result), 1);
wsacleanup;
end;
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

function GetTheInternetLocalIP: string; //获取外网IP地址
begin
Result := '';
//Use GetInternetLocalIP.pas
if not Assigned(GetInternetLocalIPForm) then
if CheckInternetOnline then
try
Application.CreateForm(TGetInternetLocalIPForm, GetInternetLocalIPForm);
while GetInternetLocalIPForm.TheInternetLocalIP = 'E' do Application.ProcessMessages;
Result := GetInternetLocalIPForm.TheInternetLocalIP;
if not IsIP(Result) then
Result := '';
finally
FreeAndNil(GetInternetLocalIPForm);
end;
end;
 
兄弟
我是懒皮狗,你的问题我可以发个小程序给你看一下。根据上面的代码改的,因为上面是利用是否可以访问网页来判断是否上线,其实在系统里面就可以获取了。因为在网吧,所以很多资料手头没有。可以上QQ和我联系!
 
兄弟
不好意思呀!我以为是千堆雪呢,见笑!
 
后退
顶部