In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

IP Publica

Foro de Xailer profesional en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

IP Publica

Mensaje por XeviCOMAS »

Lo he estado buscando... pero o no está o no lo encuentro.

Alguien tiene una función en Xailer/Harbour o un Wrapper para conocer la IP pública???

Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: IP Publica

Mensaje por XeviCOMAS »

Buscando en foros, sacando algo de allí y algo de los samples de Xailer...

Me respondo a mi mismo.

Código: Seleccionar todo

Function PublicIP()
   LOCAL hData, cData
   LOCAL cResponse := ""

   WITH OBJECT TInternet():New()
      IF :Open()
         IF !Empty( hData := :OpenURL( "http://checkip.dyndns.org" ) )
            WHILE :ReadFile( hData, @cData, 65536 )
               cResponse += cData
            ENDDO
            :CloseURL( hData )
         ENDIF
         :Close()
      ENDIF
   END

Return allTrim( substr( substr( cResponse, rat( "<body>", cResponse ) + 26 ), 1, At( "<", substr( cResponse, rat( "<body>", cResponse ) + 26 ) ) - 1 ) )


Por si a alguno le interesa o necesita, esto sirve perfectamente para saber cual es nuestra IP pública.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: IP Publica

Mensaje por XeviCOMAS »

He encontrado la clase en C para la IPpublica.
Se ve que dan permiso para publicarla...
No puedo hecharla a andar para Xailer.

Se podria incorporar para Xailer, no???

Código: Seleccionar todo

/*
Autor : Albeiro Valencia
: IP externo
Fecha : 30/07/2018
Todos los derechos reservados 
albeiroval@gmail.com

Se llama asi..
IpExterna:=IPPUBLIC() 
*/	 

#include <stdio.h>
#include <urlmon.h>
#include <WinInet.h>

#include "hbapi.h"

#pragma comment(lib, "urlmon.lib")

//-----------------------------------//

char *GetIP();
bool IsLanOrModem();

//-----------------------------------//

HB_FUNC( IPPUBLIC )
{
char *pszChar = "";

strcpy( pszChar, GetIP() );

hb_retc( pszChar );
}

//-----------------------------------//

char *GetIP() 
{
char szPath[256], szRead[128], szRet[256];
char szSite[] = "http://checkip.dyndns.org/Current IP Check.htm";
char *Token; 
char *cRet;

memset(szPath,0,sizeof(szPath));
memset(szRet,0,sizeof(szRet));

GetTempPath(256, szPath);
strcat(szPath, "my_ip.txt");

if( URLDownloadToFile(0, szSite, szPath, 0, 0) == S_OK ) 
{
FILE *fIpHtm = fopen(szPath, "r");
if( fIpHtm ) 
{
fgets(szRead, 128, fIpHtm);
Token = strrchr(szRead, ':');
Token = strtok(Token, "<");
memcpy(szRead, Token + 2, sizeof(szRead));
strcpy(cRet, szRead);

return cRet;
}
else
{	
return "Error.";
}	
}
else
return "Error.";
}

//-----------------------------------//

HB_FUNC( ISLANCONEXION )
{
hb_retl( IsLanOrModem() );
}

//-----------------------------------//

bool IsLanOrModem() 
{
DWORD result;

if (!InternetGetConnectedState(&result, 0))
return false;

return result & INTERNET_CONNECTION_LAN || result & INTERNET_CONNECTION_MODEM;
}
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: IP Publica

Mensaje por jfgimenez »

Xevi,

por lo que veo en el fuente, esta rutina depende de otras librerías, y yo no creo que tengamos ninguna necesidad de crear más dependencias.

La runtina anterior que pusiste es más que suficiente, y debería de funcionar perfectamente. Y si no quieres depender de un servidor ajeno para comprobar la IP, siempre puedes colgar el siguiente script de PHP en tu propio servidor:

Código: Seleccionar todo

<?php
if ( !empty( $_SERVER[ 'HTTP_CLIENT_IP' ] ) )
   echo $_SERVER[ 'HTTP_CLIENT_IP' ];
else if ( !empty( $_SERVER[ 'HTTP_X_FORWARDED_FOR' ] ) )
   echo $_SERVER[‘HTTP_X_FORWARDED_FOR’];
else
   echo $_SERVER[ 'REMOTE_ADDR' ];
?>
Este script te devuelve directamente la IP, y nada más, así que no tienes que ir cortando la cadena ni dependes de que en algún momento cambien el formato de dicha cadena.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: IP Publica

Mensaje por XeviCOMAS »

Gracias por responder.

Bien, solo era como apunte... si se queria tener la funcion propia en C.
A mi, me sirve de lujo la que reporté.
Un Saludo,
Xevi.
Responder