Desarrollo & Ideas & Trucos 29 de Julio del 2007 01:01 pm
Obteniendo la hora desde un servidor de Tiempo en internet con vfp (iTime)
Hace algún tiempo en www.Portalfox.com se publicaron algunos artículos para poder obtener la hora de nuestro servidor, pero en algunos casos, no nos es posible tener acceso al servidor, ya que no usamos carpetas compartidas (shared) así que no podemos hacer el trabajo por medio de esos métodos.
Y como hace algún tiempo instale linux, para pruebas de servidor de mySql, en una máquina y me dí cuenta que se puede configurar como un servidor de hora, (tengo entendido que en Windows, podemos lograrlo según Microsoft para windows 2003 y para XP también pero no he tenido tiempo de probarlo), bueno el caso es que teniendo un servidor de hora me dí cuenta que podía sincronizar las estaciones XP desde el apartado que pone Hora de internet /Internet zone, al entrar a Panel de control (Control Panel) y seleccionar Hora y Fecha (date and time).
Así que me puse a investigar, de que manera podíamos obtener la hora desde un servidor de este tipo desde vfp, según el RFC 868 el servidor debe devolver un número de 32 bits, el cual debemos sumarle en segundos a la fecha 01-01-1900. a la Fecha y Hora que obtengamos de allí, debemos restarle/sumarle la diferencia horaria según en la zona que nos encontremos.
Una explicación a grandes rasgos de lo que el servidor nos devolvera, es en números la cantidad de segundos que han pasado desde la media noche del 01-01-1900 que es la hora en formato UTC, al que luego debemos sumarle o restarle según nuestra zona para saber la hora en nuestra locación, pueden encontrar más información acá y una más completa en la wikipedia.
El proceso es sencillo e indoloro al inicio, te conectas al puerto 37 de un servidor de hora de internet o de tu red sí has configurado uno, recibes el dato del número te desconectas y haces la conversión. Bastante sencillo excepto, por que el número de 32 bits que recibe VFP es una cadena de 4 carácteres ASCII que al usar la función Long2Str que se encuentra en internet para convertir enteros de 32 bits sin signo
es que simplemente cada vez que le pasas la cadena, devuelve un número diferente que no tiene nada que ver con el anterior. Ejemplo
la primera vez que ejecute mi código obtuve este valor según STR2Long:
1199132618 que sumado a datetime(1900,01,01) me da la fecha: 31-dic-1937 20:23:38
Ejecute 3 segundos después el mismo código y me devolvió:
1434013642 + datetime(1900,01,01) me da la fecha: 11-jun-1945 09:07:22
Ejecute 1 minuto después el mismo código y me devolvió:
24793034 +datetime(1900,01,01) me da la fecha: 14-oct-2000 22:57:14
Lo que me hizo dudar del código de la función, así que estuve probando varias funciones que encontre en internet, sobre todo el sitio de news2news.com que es un excelente recurso para recursos de API en vfp;) y ninguna me devolvía un valor que se acercara lo suficiente a la hora actual. Así que dí por enterado que vfp era incapaz de procesar ese valor, y abandone el proyecto hace bastante tiempo ya.
Pero la necesidad ( o necedad según vea
) me hizo retomar el tema hace poco, así que en lugar de buscar más funciones o tratar de descifrar la preciada cadena, estuve jugando con la cadena hasta que se me ocurrio invertirla, es decir el primer carácter, va de ultimo el segundo, de penultimo, etc. y bingo ! eso es todo el secreto de la cadena devuelta por los servidores de hora. con la cadena tratada de esa manera STR2Long ya es capaz de devolverme el número correcto. ( Sí alguien sabe el porque, puede dejarmelo saber en los comentarios, por que aún no doy con una razón lógica de por que lo devuelve así).
La forma que pueden descargar desde acá, pide 2 datos escenciales Diferencia horaria y servidor de hora, sí no tienen uno configurado en la red local, pueden usar alguno del listado que tiene, o bien usar cualquiera de la lista del NIST pero con precaución, ya que solo se debe hacer una petición cada 4 segundos o de lo contrario nos pueden bannear (por IP). también pueden ver la lista que publica Microsoft
La función encargada de esto es iTime() que usa 3 parámetros.
- lcServidor: Indica el Nombre o dirección IP del servidor al que se deberá conectar para preguntar por la hora.
- lnPuerto: Puerto al que debe conectarse, normalmente será el 37.
- lnDifHoraria: Indica la cantidad de horas que debe sumar / restar para obtener la hora según la zona en la que nos encontremos o necesitemos.
Una vez que pasemos algún parámetro, no hace falta pasarlo de nuevo, a menos que necesitemos que cambie, ya que la función almacena dichos valores para futuras llamadas.
Ejemplo:
?iTime([nist1-dc.WiTime.net],37,-6) ?iTime( ) &&usara el servidor anterior, con el puerto y la diferencia horaria. ?iTime([utcnist.colorado.edu]) &&Cambia de Servidor ?iTime( , , 8 ) &&Devuelve la hora para España desde utcnist.colorado.edu:37.
En cuanto tenga tiempo trataré de armar un servidor de hora con windows xp y 2003
Para descargar la clase: http://fox.desdeguate.com/descargas/vfp/iTime.zip
Se aceptan sugerencias y comentarios. Estoy trabajando en que la pc se sincronize a la nueva hora recibida.
API, Desarrollo, Ideas, servidor de hora, sincronización hora, time server, Trucos, vfp winsock
on 29 Ago 2007 at 13:13 1.Uriel
dijo …
Hola!! Estoy tratando de implementar una API de NIC México para registro de dominios y me pide sincronizar mi servidor con el de ellos por medio del protocolo NTP, y para serte sincero, no entiendo ni-madres! jeje. Tratando de documentarme un poco para conocer la hora del servidor de NIC, llegué a tu blog, en el cual noto que eres alguien: o muy inteligente o muy ocioso (que para efectos prácticos es casi lo mismo, jeje), por lo que quise aprovechar para felicitarte por tu investigación tan perseverante. Bueno, te dejo, y sigo con mi búsuqeda… Bye
on 29 Ago 2007 at 15:03 2.Jorge Mota
dijo …
jajaja, tendría que ver, sí es que necesitas hacerlo por algún código (perl, php,vfp) etc, y en que Sistema Operativo, lo quieres hacer.