Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Saber el IP de internet LA SOLUCION !!! (https://www.clubdelphi.com/foros/showthread.php?t=30887)

RJF 22-04-2006 17:45:17

Saber el IP de internet LA SOLUCION !!!
 
No importa si estan detras de un proxy, un router, nada, porque si la PC tiene conexion a internet sabran el IP real de conexion, dado que es obtenido de una o varias paginas HTTP por medio de una consulta y un parceo, pruebenlo y comenten, esta medio crudo, pero funciona, mejorenlo. Saludos

DESCARGAR PROYECTO
http://rapidshare.de/files/18660143/SABER_IP.RAR.html

CODIGO COMPLETO
Código Delphi [-]
unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IDStack, StdCtrls, Buttons, OleCtrls, SHDocVw, ActiveX, WinInet, Winsock;

type
  TForm1 = class(TForm)
    WebB: TWebBrowser;
    TxtDireccion: TEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BitBtn2: TBitBtn;
    procedure WebBDocumentComplete(Sender: TObject; const pDisp: IDispatch;
      var URL: OleVariant);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function WebBrowerDocumentSource(webBrowser: TWebBrowser) : string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.WebBrowerDocumentSource(webBrowser: TWebBrowser) : string;
var
  ss: TStringStream;
  ips: IPersistStreamInit;
begin
  Result := EmptyStr;
  ss := TStringStream.Create(Result);
  try
    if Assigned(webBrowser) and Assigned(webBrowser.Document) then
    begin
      ips := webBrowser.Document as IPersistStreamInit;
      if Assigned(ips) and Succeeded(ips.Save(TStreamAdapter.Create(ss), true)) then
        Result := ss.DataString;
    end;
  finally
    ss.Free;
  end;
end;

//En el evento cuando se termina de cargar la pagina en el TWebBrowser
procedure TForm1.WebBDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var lineas :string;
    i,numptos, posprimpto :integer;
begin
  memo1.Text := WebBrowerDocumentSource(WebB);
  lineas := memo1.Text;
  numptos := 0;
  posprimpto := 0;
  //Para poder identificar el ip en el codigo fuente de la pagina debo hacer una busqueda dado que
  //un ip puede tener varias formas como xxx.xxx.xxx.xxx o xx.xxx.xx.xx o xx.xx.xx.xx
  for i := 1 to length(lineas) do
  begin
    if copy (lineas,i,1) = '.' then //Busco un punto en la cadena
    begin
     if i - posprimpto >4 then //Si la separacion al proximo punto es >4 ya no es un IP
       numptos := 0;
     numptos:=numptos+1;
     posprimpto := i;
    end;
    if numptos = 3 then break  //Si encontre 3 puntos es un IP valido o casi :D
  end;
  memo1.Text := copy(lineas,posprimpto-11,15); //Copio del 3 punto 11 caracteres atras y 15 adelante
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  //Le asigno la direccion al TWebBrowser
  WebB.Navigate(TxtDireccion.Text);
end;
end.

dec 22-04-2006 19:36:55

Hola,

Hombre, pues muchas gracias por acordarte de nosotros. ;)

seoane 22-04-2006 22:30:00

Prueba con esta otra direccion, te devuelve SOLO la ip. No hay que buscarla.

http://dynupdate.no-ip.com/ip.php

seoane 23-04-2006 01:05:22

Usando la direccion anterior podemos hacer una funcion que nos devuelva la ip.

Código Delphi [-]
uses WinInet, Winsock;

const
  Pagina = 'http://dynupdate.no-ip.com/ip.php';

function ObtenerIP: String;
var
  hNet: HINTERNET;
  hUrl: HINTERNET;
  Buffer: array[0..15] of Char;
  BytesRead: DWORD;
begin
  Result := '';
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hUrl := InternetOpenUrl(hNet, Pagina, nil, 0, INTERNET_FLAG_RELOAD, 0);
    if (hUrl <> nil) then
    begin
      FillChar(Buffer,Sizeof(Buffer),0);
      if InternetReadFile(hUrl, @Buffer, sizeof(Buffer)-1, BytesRead) then
        // Aqui comprobamos que la direccion que nos devuelve tiene el formato correcto
        if inet_addr(@Buffer)<>INADDR_NONE then
          Result:= Buffer;
      InternetCloseHandle(hUrl);
    end;
    InternetCloseHandle(hNet);
  end;
end;

RJF 24-04-2006 14:21:43

woooww, bastante buen codigo, lastima que lo publican ahora !!!! el problema de este codigo que depende de esa pagina en particular, si algun dia la cambian no funciona mas el codigo de la forma que yo propuse es posible buscar el ip en distintas paginas sin necesidad de cambiar codigo. Saludos y gracias

seoane 24-04-2006 14:44:11

Si la pagina que te recominedo deja de estar disponible siempre puedes colocar en un servidor que soporte php un archivo con este contenido:

Código PHP:

<?php echo $_SERVER["REMOTE_ADDR"];?>

Hay servidores gratuitos que soportan php asi que no tendrias problema.

seoane 24-04-2006 15:30:14

Dandole otra vuelta de tuerca al asunto, hay ISP (Proveedores de servicios de internet) que utilizan lo que se denomina proxys transparentes. Es decir, el usuario desconoce su existencia, pero todo el trafico web pasa a traves del proxy, que lo guarda en una cache.

Pues bien para obtener la "verdadera" direccion ip y no la del proxy podemos usar en vez de:

http://dynupdate.no-ip.com/ip.php

Esta otra (observese que es https y no http):

https://dynupdate.no-ip.com/ip.php

En principio el proxy no intercepta las conexiones seguras, no tendria sentido, ya que los datos van encriptados y no serviria de nada guardarlos en una cache. Asi que la conexion es directa.

Se me ocurre incluso que una buena forma de averiguar si se esta detras de un proxy transparente es obtener la ip con la primera direccion (la no segura) y volverla obtener con la segunda direccion, si son diferentes es que ;) hay algo sospechoso. Esto ultimo no lo puedo probar porque mi ISP ya ha dejado de usar el proxy-cache, pero lo dejo por si alguien tiene curisosidad.

RJF 24-04-2006 15:30:24

Gracias, buen dato.
Con todo esto creo que ha quedado claro el mitico tema de como obtener el ip de internet, esto esta mas que claro, pero si alguien tiene otra duda que pregunte nomas

tulio 02-05-2006 12:39:15

Hola RJF

Gracias por tu colaboracion, te cuento que probe el codigo y al reinventar el formulario con los componentes me da algunos errores, mi pregunta es si podes publicar el proyecto con el formulario que tenga los componentes del codigo que escribiste.

Muchas Gracias

tulio

rgsoria@hotmail.com

RJF 30-06-2006 15:12:30

Código:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IDStack, StdCtrls, Buttons, OleCtrls, SHDocVw, ActiveX, WinInet, Winsock;
type
  TForm1 = class(TForm)
    WebB: TWebBrowser;
    TxtDireccion: TEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BitBtn2: TBitBtn;
    Button1: TButton;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure WebBDocumentComplete(Sender: TObject; const pDisp: IDispatch;
      var URL: OleVariant);
    procedure BitBtn2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function WebBrowerDocumentSource(webBrowser: TWebBrowser) : string;
  end;
var
  Form1: TForm1;
implementation

les dejo la cabecera del proyecto para que vean las unidades utilizadas, realizado en Delphi 7


La franja horaria es GMT +2. Ahora son las 00:33:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi