pegar IP REAL

Delphi

27/10/2004

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


Seven

Seven

Curtidas 0

Respostas

Oscar Candido

Oscar Candido

27/10/2004

Amigo, espero que seja isso:
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

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


GOSTEI 0
Ipc$

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.


GOSTEI 0
Fernando

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


GOSTEI 0
Cabelo

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


GOSTEI 0
Ipc$

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

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.


GOSTEI 0
Otto

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
POSTAR