Форум » [x]Harbour » синхронизация с сервером точного времени » Ответить

синхронизация с сервером точного времени

fil: Понадобилось сделать синхронизацию с сервером точного времени (напр. timeserver.ru) Пишут, что нужно коннектился с этим сервером по 13 или 37 порту. Однако получаю ошибку. Только по 80 могу. Не подскажете чего ?

Ответов - 5

petr707: click here есть пример синхронизации по NTP протоколу в MINIGUI \MiniGUI\SAMPLES\Applications\ATOMIC_TIME\

fil: Спасибо, посмотрю

Dima: с форума FW [pre2] Proc Main ? GetNtpDate( "31.28.161.71" ) //204.123.2.72 return nil #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 ENDDUMP [/pre2]


gfilatov2002: Вариант использования на чистом Харборе: [pre2]/* Copyright 2013-2014 Viktor Szakats (vszakats.net/harbour) */ #include "hbsocket.ch" #include "hbver.ch" PROCEDURE Main() LOCAL tTime Set( _SET_DATEFORMAT, "yyyy-mm-dd" ) IF Empty( tTime := hb_ntp_GetTimeUTC( "ntp.mobatime.ru" ) ) ? "Network not available" ENDIF ? "UTC time:", tTime ? "Local time:", tTime + hb_UTCOffset() / 86400 ? "System time:", hb_DateTime() wait RETURN FUNCTION hb_ntp_GetTimeUTC( cServer, nPort, nTimeOut ) LOCAL tTime := hb_SToT( "" ) LOCAL hSocket, cBuffer IF HB_ISSTRING( cServer ) .AND. ! Empty( cServer ) .AND. ; ! Empty( hSocket := hb_socketOpen( , HB_SOCKET_PT_DGRAM ) ) cBuffer := hb_BChar( 8 ) + Replicate( hb_BChar( 0 ), 47 ) IF hb_socketSendTo( hSocket, cBuffer,,, { HB_SOCKET_AF_INET, hb_socketResolveAddr( cServer ), hb_defaultValue( nPort, 123 ) } ) == hb_BLen( cBuffer ) cBuffer := Space( 12 * 4 ) IF hb_socketRecvFrom( hSocket, @cBuffer,,,, hb_defaultValue( nTimeOut, 10000 /* 10s */ ) ) == hb_BLen( cBuffer ) tTime := hb_SToT( "19000101" ) + ; Bin2U( ntohl( hb_BSubStr( cBuffer, 10 * 4 + 1, 4 ) ) ) / 86400 + ; ( Bin2U( ntohl( hb_BSubStr( cBuffer, 11 * 4 + 1, 4 ) ) ) / ( 2 ^ 32 ) ) / 86400 ENDIF ENDIF hb_socketClose( hSocket ) ENDIF RETURN tTime STATIC FUNCTION ntohl( c ) IF hb_Version( HB_VERSION_ENDIANNESS ) == HB_VERSION_ENDIAN_LITTLE RETURN ; hb_BSubStr( c, 4, 1 ) + ; hb_BSubStr( c, 3, 1 ) + ; hb_BSubStr( c, 2, 1 ) + ; hb_BSubStr( c, 1, 1 ) ENDIF RETURN c STATIC FUNCTION Bin2U( c ) LOCAL l := Bin2L( c ) RETURN iif( l < 0, l + ( 2 ^ 32 ), l )[/pre2]

fil: Дима, Григорий, спасибо ! Все работает. Это изящнее чем сайт через DOM разбирать



полная версия страницы