pegar IP REAL
alo !?
estou precisando pegar o IP-REAL da maquina..
consegui alguns exemplos aqui...
mas soh me da tipo o ip interno...
192.168.1.10
etc...
preciso daquele ip
200...
desde ja agradeço
[]s
estou precisando pegar o IP-REAL da maquina..
consegui alguns exemplos aqui...
mas soh me da tipo o ip interno...
192.168.1.10
etc...
preciso daquele ip
200...
desde ja agradeço
[]s
Seven
Curtidas 0
Respostas
Oscar Candido
27/10/2004
Amigo, espero que seja isso:
Espero ter ajudado
Um Abraço
function GetIP:string; //--> Declare a Winsock na clausula uses da unit var WSAData: TWSAData; HostEnt: PHostEnt; Name:string; begin WSAStartup(2, WSAData); SetLength(Name, 255); Gethostname(PChar(Name), 255); SetLength(Name, StrLen(PChar(Name))); HostEnt := gethostbyname(PChar(Name)); with HostEnt^ do begin Result := Format(´¬d.¬d.¬d.¬d´, [Byte(h_addr^[0]),Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]); end; WSACleanup; end;
Espero ter ajudado
Um Abraço
GOSTEI 0
Seven
27/10/2004
alo Oscar,
obrigado pela dica...
porem... esse IP que ele retorna é o da maquina e não o da NET, entende !?
eu precisaria daquele...
200.163.7.1 (ou coisa do tipo)
e ele retorna ...
192.168.1.13
mesmo assim , valeu
[]s
obrigado pela dica...
porem... esse IP que ele retorna é o da maquina e não o da NET, entende !?
eu precisaria daquele...
200.163.7.1 (ou coisa do tipo)
e ele retorna ...
192.168.1.13
mesmo assim , valeu
[]s
GOSTEI 0
Ipc$
27/10/2004
Olá colega, bom é pq ele está pegando o primeiro addr e não a lista de ips válidos. Vc tem que pegar o h_addr_list de HostEnt, onde estão todos os ips válidos da sua máquina.
Declare adicionalmente à este código:
type TaPInAddr = array [0..10] of PInAddr;
type PaPInAddr = ^TaPInAddr;
var PPIA:PaPInAddr; i:Integer;
Feito isso, substitua o bloco begin/end de [b:3c8b368136]with HostEnt^ do[/b:3c8b368136] Por:
with HostEnt^ do
begin
PPIA := PaPInAddr(HostEnt^.h_addr_list);
i := 0;
Result := ´´;
while PPIA^[I] nil do begin
Result := Result + StrPas(inet_ntoa(PPIA^[I]^)) + #1310;
Inc(I);
end;
end;
PPIA é a lista de addrs e inet_ntoa é a função que converte o addr ip.
Com isto a função deverá retornar a lista dos ips e geralmente o da internet deve ser o último.
Declare adicionalmente à este código:
type TaPInAddr = array [0..10] of PInAddr;
type PaPInAddr = ^TaPInAddr;
var PPIA:PaPInAddr; i:Integer;
Feito isso, substitua o bloco begin/end de [b:3c8b368136]with HostEnt^ do[/b:3c8b368136] Por:
with HostEnt^ do
begin
PPIA := PaPInAddr(HostEnt^.h_addr_list);
i := 0;
Result := ´´;
while PPIA^[I] nil do begin
Result := Result + StrPas(inet_ntoa(PPIA^[I]^)) + #1310;
Inc(I);
end;
end;
PPIA é a lista de addrs e inet_ntoa é a função que converte o addr ip.
Com isto a função deverá retornar a lista dos ips e geralmente o da internet deve ser o último.
GOSTEI 0
Fernando
27/10/2004
tem uma formula + facil de usar,
que uso no mesmo sistema para pegar o ip
coloque um componente da internet chamado WebBrowser
e no evento onclick do botão coloque o seguinte
WebBrowser1.Navigate(´http://ip.doctornet.com.br´);
esse endereço são alguns que te daõ o ip
ele vai abrir uma pagina igual ao explorer, so que vai te dar o ip
que esta site fornece, dessa forma vc podera colocar qualquer indereço no webbroser
value
que uso no mesmo sistema para pegar o ip
coloque um componente da internet chamado WebBrowser
e no evento onclick do botão coloque o seguinte
WebBrowser1.Navigate(´http://ip.doctornet.com.br´);
esse endereço são alguns que te daõ o ip
ele vai abrir uma pagina igual ao explorer, so que vai te dar o ip
que esta site fornece, dessa forma vc podera colocar qualquer indereço no webbroser
value
GOSTEI 0
Cabelo
27/10/2004
Colega..
Esta idéia sua do WebBrowser funciona bem, mas o problema é que preciso do retorno do número do IP numa variável por exemplo..
Não quero visualizar meu ip, já que isso seria mais fácil, abrindo o meu NAT/Servidor Virtual da rede..
Como fazer então??
Já a outra opção, com a função GetIP não funcionou, retornou o IP da minha máquina, mesmo com as alterações .. Como fazer?
Agradeço antecipadamente..
Cabelo
Esta idéia sua do WebBrowser funciona bem, mas o problema é que preciso do retorno do número do IP numa variável por exemplo..
Não quero visualizar meu ip, já que isso seria mais fácil, abrindo o meu NAT/Servidor Virtual da rede..
Como fazer então??
Já a outra opção, com a função GetIP não funcionou, retornou o IP da minha máquina, mesmo com as alterações .. Como fazer?
Agradeço antecipadamente..
Cabelo
GOSTEI 0
Ipc$
27/10/2004
Já a outra opção, com a função GetIP não funcionou, retornou o IP da minha máquina, mesmo com as alterações .. Como fazer?
Se vc estiver querendo pegar o ip de outra máquina na rede, é claro que essa função não irá funcionar. Ela só fornece a lista de ips válidos da [b:7c9d032d9d]sua[/b:7c9d032d9d] máquina.
Para vc pegar o ip de outra máquina, veja as funções da NetApi32.dll que estou quase certo que exista uma função para isso.
GOSTEI 0
Seven
27/10/2004
Alo Pessoal...
acho que do jeito que o IPC é exatamente a que precisava, ´só não tive tempo de testar.. quando voltar de viagem irei fzer isso...
quanto a formula do fernando...
consegui fazer um exemplo... não sei se é o mais correto.. mas funciona bem,
var
stl : tstrings;
ip : string;
begin
ip := ´´;
stl := Tstringlist.Create;
stl.Add(IdHTTP1.Get(´http://ip.doctornet.com.br´));
for i := 0 to length(stl.Text) do
begin
if copy(stl.Text,i,4) = ´200.´ then
begin
for i2 := i to i+20 do
begin
if ((copy(stl.Text,i2,1) < ´0´) or (copy(stl.Text,i2,1) > ´9´)) and (copy(stl.Text,i2,1) <> ´.´) then break;
ip := ip +copy(stl.Text,i2,1);
end;
break
end;
end;
end;
[]´s
T+
P.S.: talvez os BEGIN/END não estejam corretos, pois tirei esse pedaço do meu projeto.
acho que do jeito que o IPC é exatamente a que precisava, ´só não tive tempo de testar.. quando voltar de viagem irei fzer isso...
quanto a formula do fernando...
consegui fazer um exemplo... não sei se é o mais correto.. mas funciona bem,
var
stl : tstrings;
ip : string;
begin
ip := ´´;
stl := Tstringlist.Create;
stl.Add(IdHTTP1.Get(´http://ip.doctornet.com.br´));
for i := 0 to length(stl.Text) do
begin
if copy(stl.Text,i,4) = ´200.´ then
begin
for i2 := i to i+20 do
begin
if ((copy(stl.Text,i2,1) < ´0´) or (copy(stl.Text,i2,1) > ´9´)) and (copy(stl.Text,i2,1) <> ´.´) then break;
ip := ip +copy(stl.Text,i2,1);
end;
break
end;
end;
end;
[]´s
T+
P.S.: talvez os BEGIN/END não estejam corretos, pois tirei esse pedaço do meu projeto.
GOSTEI 0
Otto
27/10/2004
const ANY_SIZE = 1;
type
PTMibIPAddrRow = ^TMibIPAddrRow;
TMibIPAddrRow = packed record
dwAddr: DWORD;
dwIndex: DWORD;
dwMask: DWORD;
dwBCastAddr: DWORD;
dwReasmSize: DWORD;
Unused1,
Unused2: WORD;
end;
PTMibIPAddrTable = ^TMibIPAddrTable;
TMibIPAddrTable = packed record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIPAddrRow;
end;
function GetIpAddrTable( pIpAddrTable: PTMibIPAddrTable;
pdwSize: PULONG;
bOrder: BOOL ): DWORD;
stdcall; external ´IPHLPAPI.DLL´;
{ converts IP-address in network byte order DWORD to dotted decimal string}
function IpAddr2Str( IPAddr: DWORD ): string;
var
i : integer;
begin
Result := ´´;
for i := 1 to 4 do
begin
Result := Result + Format( ´¬3d.´, [IPAddr and $FF] );
IPAddr := IPAddr shr 8;
end;
Delete( Result, Length( Result ), 1 );
end;
procedure Get_IPAddrTable(Tipo: Integer; List: TStrings );
var
IPAddrRow : TMibIPAddrRow;
TableSize : DWORD;
ErrorCode : DWORD;
i : integer;
pBuf : PChar;
NumEntries : DWORD;
begin
if not Assigned( List ) then EXIT;
List.Clear;
TableSize := 0; ;
// first call: get table length
ErrorCode := GetIpAddrTable( PTMibIPAddrTable( pBuf ), @TableSize, true );
if Errorcode <> ERROR_INSUFFICIENT_BUFFER then
EXIT;
GetMem( pBuf, TableSize );
// get table
ErrorCode := GetIpAddrTable( PTMibIPAddrTable( pBuf ), @TableSize, true );
if ErrorCode = NO_ERROR then
begin
NumEntries := PTMibIPAddrTable( pBuf )^.dwNumEntries;
if NumEntries > 0 then
begin
inc( pBuf, SizeOf( DWORD ) );
for i := 1 to NumEntries do
begin
Case Tipo of
1 : begin
IPAddrRow := PTMIBIPAddrRow( pBuf )^;
with IPAddrRow do
List.Add( Format( ´¬8.8x|¬15s|¬15s|¬15s|¬8.8d´,
[dwIndex, IPAddr2Str( dwAddr ), IPAddr2Str( dwMask ),
IPAddr2Str( dwBCastAddr ), dwReasmSize ] ) );
inc( pBuf, SizeOf( TMIBIPAddrRow ) );
end;
2 : begin
IPAddrRow := PTMIBIPAddrRow( pBuf )^;
List.Add( Format(´¬15s´,[IPAddr2Str(IPAddrRow.dwAddr)]) );
inc( pBuf, SizeOf( TMIBIPAddrRow ) );
end;
//3 : //;
end;
end;
end
else
List.Add( ´no entries.´ );
end
else
List.Add( SysErrorMessage( ErrorCode ) );
// we must restore pointer!
dec( pBuf, SizeOf( DWORD ) + NumEntries * SizeOf( IPAddrRow ) );
FreeMem( pBuf );
end;coloque um memo e um combobox no form, e no OnCreate do form, coloque o seguinte:
Get_IPAddrTable(1, Memo1.Lines); Get_IPAddrTable(2, ComboBox1.Items);
GOSTEI 0