Data e hora do servidor

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Data e hora do servidor

Mensagem por Hasse »

Boa noite colegas.

Pesquisei no Fórum por "data e hora do servidor" e encontrei um tópico.

Pelo que entendi não existe uma Função no Harbour / xHarbour que nos possa fornecer a data e hora do servidor.

Aquele método proposto mais parece uma "gambiarra". Primeiro aciona-se um *.BAT, que grava um *.TXT com a data e a hora, que depois é lido via MemoRead(), interpretado e gravado numa variável com a data e hora.

Ainda não temos uma solução melhor ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Data e hora do servidor

Mensagem por Pablo César »

Aquele método proposto mais parece uma "gambiarra". Primeiro aciona-se um *.BAT, que grava um *.TXT com a data e a hora, que depois é lido via MemoRead(), interpretado e gravado numa variável com a data e hora.
Se foi uma solução para Clipper... não vejo como não usar isso...

Você leu este tópico ?

https://pctoledo.org/forum/viewto ... 985#p86985

Ou pesquisou por: HB_DATETIME() ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Data e hora do servidor

Mensagem por Itamar M. Lins Jr. »

Se instalar o letodb no servidor, ele retorna a data e hora para as estações.

Código: Selecionar todos

   aDH := LETO_MGGETTIME()
   If DToS(aDH[1]) <> DToS(DATE())
      Hwg_MsgStop("Corrija a data do computador.")
Ou usar outro serviço só para isso criado pelo próprio harbour via socket.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Data e hora do servidor

Mensagem por Jairo Maia »

Olá Hasse,
Hasse escreveu:Pelo que entendi não existe uma Função no Harbour / xHarbour que nos possa fornecer a data e hora do servidor.
Me parece que não, e como ainda não uso LetoDB, acabei optando também por uma gambiarra como você chamou, até que apareça algo mais inteligente para poder usar:

1-Envio um arquivo ao servidor como DATETIME.GET
2-O servidor então cria um arquivo como DATETIME.SAY
3-Faço a leitura da data e hora desse arquivo
4-Comparo a data (claro, sem tolerância), e a hora com tolerância de 10 segundos
5-Qualquer diferença, o terminal é sincronizado e apenas aviso o usuário que a Data e Hora do Terminal foi sincronizada com o Servidor.

Veja que na contrib em: contrib\hbwin\tests\oletst1.prg tem este exemplo, que não consegui testar, mas não me preocupei porque ele não faz nada diferente do que faço hoje.

Nota: Não usei a Tag Code para destacar algo que acho importante:
#define NETSERVER "127.0.0.1"
#define NETPORT 2941
#define NETPASSWD "topsecret"

PROCEDURE Main()
LOCAL oObject

oObject := win_OleCreateObject( "MyOleRPCServer" )

IF !Empty( oObject )
IF oObject:connect( NETSERVER, NETPORT,, NETPASSWD )
? "Connected to the server:", NETSERVER
/*
execute some functions on the server side and display
the results.
*/

? oObject:upper( "hello world !!!" )
? "SERVER DATE:", oObject:DATE()
? "SERVER TIME:", oObject:TIME()
? "SERVER DATETIME:", oObject:HB_DATETIME()
ELSE
? "Cannot connect to the server:", NETSERVER
ENDIF
ELSE
? "Can not access 'MyOleRPCServer' OLE server."
ENDIF

WAIT
RETURN
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Data e hora do servidor

Mensagem por Hasse »

Boa noite colegas Pablo, Itamar e Jairo.

Pablo:
Eu havia visto este tópico, mas este aplicativo ainda está sendo compilado em xHarbour, infelizmente.

Itamar:
Acho que ainda vou ficar com a "gambiarra" para evitar instalar mais um aplicativo no servidor.

Jairo:
Certamente ainda vou testar esta opção "Tag Code". Certamente, se eu obtiver êxito, posto o resultado.

Obrigado pelas informações sempre tão valiosas e solucionadoras.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Data e hora do servidor

Mensagem por Itamar M. Lins Jr. »

Porque para ler arquivo no servidor você precisa compartilha alguma pasta.
E para trabalha via sockets, precisa liberar alguma porta que o programa irá usar p/ comunicação com as estações.
Porém as duas formas precisa de um gatilho, e no servidor irá sempre ter algo rodando esperando para informar a DATATIME.

Tem um exemplo tosco que achei e testei aqui via socket e funcionou.
Essas são áreas ainda pouco exploradas por mim.

tcp_servidor.prg

Código: Selecionar todos

#include "hbsocket.ch"

#define ADDRESS                     "127.0.0.1"
#define PORT                        10000
#define EOT                         ( Chr( 4 ) )
#define LISTEN_TIMEOUT              3000            // 3s
#define RECV_TIMEOUT                10000           // 10s

request HB_MT

procedure main()

    local hListen
    local hSocket

    if !hb_mtvm()
        ? "multithread support required"
        return
    endif

    ? "create listening socket..."
    if empty( hListen := hb_socketOpen() )
        ? "socket create error " + hb_ntos( hb_socketGetError() )
    endif
    if !hb_socketBind( hListen, { HB_SOCKET_AF_INET, ADDRESS, PORT } )
        ? "bind error " + hb_ntos( hb_socketGetError() )
    endif
    if !hb_socketListen( hListen )
        ? "listen error " + hb_ntos( hb_socketGetError() )
    endif
    do while .t.
        if empty( hSocket := hb_socketAccept( hListen, , LISTEN_TIMEOUT ) )
            if hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT
                ? "loop..."
            else
                ? "accept error " + hb_ntos( hb_socketGetError() )
            endif
        else
            ? "accept socket request"
            hb_threadDetach( hb_threadStart( @process(), hSocket ) )
        endif
        if inkey() == 27
            ? "quitting - esc pressed"
            exit
        endif
    enddo
    ? "close listening socket..."
    hb_socketShutdown( hListen )
    hb_socketClose( hListen )

return


procedure process( hSocket )

    local cRequest
    local nLen
    local cBuf

    do while .t.
        cRequest := ""
        nLen := 1
        do while at( EOT, cRequest ) == 0 .and. nLen > 0
            cBuf := space( 4096 )
            if ( nLen := hb_socketRecv( hSocket, @cBuf, , , RECV_TIMEOUT ) ) > 0
                cRequest += left( cBuf, nLen )
            else
                if nLen == -1 .AND. hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT
                    nLen := 0
                endif
            endif
        enddo

        if nLen == -1
            ? "hb_socketRecv error " + hb_ntos( hb_socketGetError() )
        elseif nLen == 0
            ? "connection closed"
            exit
        else
            ? cRequest
            If "date" $ cRequest
            	? hb_socketSend( hSocket, dtoc(date()) + EOT  )
            endif
            if "exit" $ cRequest
                ? "exit"
                exit
            endif
        endif
    enddo
    ? "close socket..."
    hb_socketShutdown( hSocket )
    hb_socketClose( hSocket )

return
tcp_cliente.prg

Código: Selecionar todos

#include "hbsocket.ch"

#define ADDRESS                     "127.0.0.1"
#define PORT                        10000
#define EOT                         ( Chr( 4 ) )
#define RECV_TIMEOUT                10000           // 10s

procedure main()

    local hSocket
    local cRequest
    local nLen
    local cBuf

    if empty( hSocket := hb_socketOpen() )
        ? "socket create error " + hb_ntos( hb_socketGetError() )
    endif
    if !hb_socketConnect(hSocket, { HB_SOCKET_AF_INET, ADDRESS, PORT } )
        ? "socket connect error " + hb_ntos( hb_socketGetError() )
    endif


    ? hb_socketSend( hSocket, "Ola !" + EOT  )
    ? hb_socketSend( hSocket, "Tudo Bem ?" + EOT  )
    ? hb_socketSend( hSocket, "date ?" + EOT  )

        cRequest := ""
        nLen := 1

        do while at( EOT, cRequest ) == 0 .and. nLen > 0
            cBuf := space( 4096 )
            if ( nLen := hb_socketRecv( hSocket, @cBuf, , , RECV_TIMEOUT ) ) > 0
                cRequest += left( cBuf, nLen )
            else
                if nLen == -1 .AND. hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT
                    nLen := 0
                endif
            endif
        enddo

        if nLen == -1
            ? "hb_socketRecv error " + hb_ntos( hb_socketGetError() )
        elseif nLen == 0
            ? "connection closed"
        else
            ? cRequest
        endif

    ? hb_socketSend( hSocket, "exit" + EOT  )

    hb_socketShutdown( hSocket )
    hb_socketClose( hSocket )

return

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder