Página 1 de 1

Data e hora do servidor

Enviado: 05 Ago 2014 22:11
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 ?

Data e hora do servidor

Enviado: 05 Ago 2014 23:22
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() ?

Data e hora do servidor

Enviado: 06 Ago 2014 09:16
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.

Data e hora do servidor

Enviado: 06 Ago 2014 10:58
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

Data e hora do servidor

Enviado: 06 Ago 2014 19:29
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.

Data e hora do servidor

Enviado: 07 Ago 2014 09:11
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.