Servidor NTP para harbour 3.0
Enviado: 19 Dez 2013 11:48
amigos existe alguma funçao harbour que atualize a hora via internet por servidor ntp
agradeço des de ja
agradeço des de ja
Código: Selecionar todos
Function Main()
Alert( STRTRAN(PegaDtHrBrasilia(), '*',';' ) )
RETURN NIL
Function PegaDtHrBrasilia()
// baseado em exemplo Minigui disponibilizado na Seção de Downloads pelo Pablo César
Local cRet := "", cPagina := ""
local cTexto := "Acerte seu relógio com o horário de Brasília, a hora oficial do Brasil"
IF (oOle := Cria_OLE( "InternetExplorer.Application", , .T.)) == NIL
RETURN .F.
ENDIF
oOle:Visible := .F. // Apresenta o Browser
oOle:ToolBar := .F. // Desativa a barra de ferramentas
oOle:StatusBar := .F. // Desativa a barra de status
oOle:MenuBar := .F. // desativa a barra de menu
oOle:Navigate("http://www.horariodebrasilia.org/")
WHILE oOle:ReadyState() != 4 // Aguarda página ser carregada, mesmo q não seja visualizado no Navegador (opão Visible := F ou T)
INKEY(.5)
END
INKEY(.2)
*** Retrieve the entire HTML document as a string
cPagina := oOle:Document():Body:InnerText
oOle := NIL
If cTexto $ cPagina
cPagina := Substr(cPagina,At(cTexto,cPagina)+70)
cPagina := Substr(cPagina,At(",",cPagina)+1)
cPagina := Alltrim(Substr(cPagina,1,At(CRLF,cPagina)+11))
cDia := Strzero(Val(Substr(cPagina,1,At(" ",cPagina))),2,0)
cPagina := Substr(cPagina,At("de ",cPagina)+3)
cMes := VqMes(Alltrim(Substr(cPagina,1,At(" ",cPagina))))
cPagina := Substr(cPagina,At("de ",cPagina)+3)
cAno := Substr(cPagina,1,At(CRLF,cPagina)-1)
cPagina := Substr(cPagina,At(CRLF,cPagina)+4)
cData := cDia+"/"+cMes+"/"+cAno
cHora := Substr(cPagina,1,8)
cRet := cData+'*'+cHora
Else
cRet := "Erro"
Endif
Return cRet
********************************************************************************
Function VqMes(cText)
Local cNMes
Do Case
Case cText=="janeiro"
cNMes := "01"
Case cText=="fevereiro"
cNMes := "02"
Case cText=="março"
cNMes := "03"
Case cText=="abril"
cNMes := "04"
Case cText=="maio"
cNMes := "05"
Case cText=="junho"
cNMes := "06"
Case cText=="julho"
cNMes := "07"
Case cText=="agosto"
cNMes := "08"
Case cText=="setembro"
cNMes := "09"
Case cText=="outubro"
cNMes := "10"
Case cText=="novembro"
cNMes := "11"
Case cText=="dezembro"
cNMes := "12"
EndCase
Return cNMes
Código: Selecionar todos
*******************************************
* Compilar: hbmk2 arquivo.prg -lhbct
*******************************************
function Main()
SetMode(25,80)
cDataHora:= GetDataTimeNtp( "200.160.7.186")
/*****************************************
* Outros IP:
* 200.160.7.186
* 200.186.125.195
* 200.20.186.76
* 201.49.148.135
* 200.160.7.193
* 200.160.0.8
* 200.189.40.8
* 200.192.232.8
* 204.123.2.72
* 31.28.161.71
*****************************************/
? "Data: ",Left(cDataHora,10)
? "Hora: ",Right(cDataHora,8)
return nil
******************************************
function GetDataTimeNtp( cSeverNtp )
Local cRet, cDateTime:= Alltrim(GETNTPDATE( cSeverNtp ))
cRet:=SUBS(cDateTime,9,2)+"/"+StrZero(CtoMonth(SUBS(cDateTime,5,3)),2)+"/"+Alltrim(Right(cDateTime,5))+;
SUBS(cDateTime,11,9)
Return (cRet)
*****************************************
#pragma BEGINDUMP
#include <hbapi.h>
#include <winsock.h>
#include <time.h>
#define MAXLEN 1024
HB_FUNC( GETNTPDATE )
{
char * hostname = ( char * ) hb_parc( 1 );
unsigned char msg[ 48 ] = { 010, 0, 0, 0, 0, 0, 0, 0, 0 }; // the packet we send
unsigned long buf[ MAXLEN ]; // the buffer we get back
struct sockaddr_in server_addr;
int s; // socket
WSADATA wsa;
struct timeval timeout;
fd_set fds;
time_t tmit;
WSAStartup( 0x101, &wsa );
s = socket( PF_INET, SOCK_DGRAM, getprotobyname( "udp" )->p_proto );
memset( &server_addr, 0, sizeof( server_addr ) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr( hostname );
server_addr.sin_port = htons( 123 ); // ntp port
sendto( s, msg, sizeof( msg ), 0, ( struct sockaddr * ) &server_addr, sizeof( server_addr ) );
FD_ZERO( &fds );
FD_SET( s, &fds );
timeout.tv_sec = 10;
timeout.tv_usec = 0;
if( select( 0, &fds, NULL, NULL, &timeout ) )
{
recv( s, ( void * ) buf, sizeof( buf ), 0 );
tmit = ntohl( buf[ 10 ] );
tmit-= 2208988800U;
}
else
MessageBox( 0, "can't read from NTP server", "ok", 0 );
WSACleanup();
hb_retc( ctime( &tmit ) );
}
#pragma ENDDUMPAo executar o arquivo, é apresentado a data e hora, mas ocorre o seguinte erro:C:\programa\forum\sntp>hbmk2 demo.prg -lhbct
hbmk2: Processando op‡äes do ambiente: -compiler=bcc
Harbour 3.0.0 (Rev. 16951)
Copyright (c) 1999-2011, http://harbour-project.org/
Compiling 'demo.prg'...
Lines 89, Functions/Procedures 2
Generating C source output to 'C:\DOCUME~1\TOLEDO~1\CONFIG~1\Temp\hbmk_0h4ims.di
r\demo.c'... Done.
C:\DOCUME~1\TOLEDO~1\CONFIG~1\Temp\hbmk_0h4ims.dir\demo.c:
Warning W8079 demo.prg 67: Mixing pointers to different 'char' types in functio
n HB_FUN_GETNTPDATE
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Segue em anexo o arquivo compilado com o Harbour 3.0 e MingW.C:\programa\forum\sntp>demo
Data: 19/12/2013
Hora: 17:35:08
Unrecoverable error 6005: Exception error:
Exception Code:C0000005
Exception Address:00481176
EAX:011D0004 EBX:011D3E98 ECX:011D0000 EDX:023A0008
ESI:00499078 EDI:0048C0D2 EBP:0012FF0C
CS:EIP:001B:00481176 SS:ESP0012FF08
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010202
CS:EIP: F6 02 01 74 2A 8B 0A 83 E1 FC 83 C1 04 01 08 3B
SS:ESP: 00DD20A0 0012FF18 00481114 011D3E98 0012FF24 00480A15 011D3E98 0012F
F5C 00488F12 011D3E98 00000002 0048C0FC 00488A2B 00000000 0048C13C 00000000
...
Só uma observação, em uma das minhas mensagens acima eu falei que não uso o BCC e sim o MingW, eu não falei nada sobre MiniGui.Josivan Nascimento escreveu:fico meio perdido tipo bcc mingui