Page 1 of 1

IP Publica

Posted: Thu Oct 25, 2018 2:28 pm
by 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.

Re: IP Publica

Posted: Thu Oct 25, 2018 4:36 pm
by XeviCOMAS
Buscando en foros, sacando algo de allí y algo de los samples de Xailer...

Me respondo a mi mismo.

Code: Select all

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.

Re: IP Publica

Posted: Fri Dec 07, 2018 4:47 pm
by 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???

Code: Select all

/*
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;
}

Re: IP Publica

Posted: Sun Dec 09, 2018 1:04 pm
by 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:

Code: Select all

<?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.

Re: IP Publica

Posted: Mon Dec 10, 2018 10:33 am
by 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é.