Автор | Сообщение |
|
| |
Пост N: 437
Зарегистрирован: 17.06.10
|
|
Отправлено: 30.05.16 18:32. Заголовок: синхронизация с сервером точного времени
Понадобилось сделать синхронизацию с сервером точного времени (напр. timeserver.ru) Пишут, что нужно коннектился с этим сервером по 13 или 37 порту. Однако получаю ошибку. Только по 80 могу. Не подскажете чего ?
|
|
|
Ответов - 5
[только новые]
|
|
|
| |
Пост N: 189
Зарегистрирован: 21.04.13
|
|
Отправлено: 30.05.16 19:17. Заголовок: Почему не NTP ?
click here есть пример синхронизации по NTP протоколу в MINIGUI \MiniGUI\SAMPLES\Applications\ATOMIC_TIME\
|
|
|
|
| |
Пост N: 438
Зарегистрирован: 17.06.10
|
|
Отправлено: 30.05.16 19:59. Заголовок: Спасибо, посмотрю..
Спасибо, посмотрю
|
|
|
|
| |
Пост N: 5694
Зарегистрирован: 17.05.05
|
|
Отправлено: 31.05.16 09:25. Заголовок: с форума FW Pro..
с форума FW 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
|
|
|
|
| moderator
|
Пост N: 950
Зарегистрирован: 11.02.10
|
|
Отправлено: 31.05.16 09:50. Заголовок: Вариант использовани..
Вариант использования на чистом Харборе: /* 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 )
|
|
|
|
| |
Пост N: 439
Зарегистрирован: 17.06.10
|
|
Отправлено: 01.06.16 09:08. Заголовок: Дима, Григорий, спас..
Дима, Григорий, спасибо ! Все работает. Это изящнее чем сайт через DOM разбирать
|
|
|
|