синхронизация времени NetRemoteTOD

Тема в разделе "WASM.BEGINNERS", создана пользователем zxcc, 5 дек 2011.

  1. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Здравствуйте.
    Нужна помощь по синхронизация времени с сервером (NetRemoteTOD). У кого есть примеры для masm?
     
  2. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Как можно синхронизировать время по интернету с сервером?
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Так понял нужен список серверов времени поддерживающих протокол SNTP?
    И потом с их помощью обновить лок. время?
     
  4. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Как это можно сделать в программе?
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    А где "пожалуйста"?
     
  6. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Извиняюсь,пожалуйста.
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ну во первых нужно определить - какой сервер тебе подойдет,
    то есть сам ты откуда ))
    [​IMG]

    ... далее Европа ...

    [​IMG]

    ... потом Украина ))

    [​IMG]

    Найден твой сервер для синхр. времени.
    Теперь задача тебе достучаться к нему.
    Пишешь клиент
    Код (Text):
    1. ;Get SNTP Time
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. include \masm32\include\wsock32.inc
    9. include \masm32\include\masm32.inc
    10. includelib \masm32\lib\user32.lib
    11. includelib \masm32\lib\kernel32.lib
    12. includelib \masm32\lib\wsock32.lib
    13. includelib \masm32\lib\masm32.lib
    14. ; Microsoft Visual C++ Lib
    15. includelib \masm32\lib\msvcrt.lib
    16. ;
    17. .const
    18. WindowWidth     equ     500     ;
    19. WindowHight     equ     100     ;
    20. ;
    21. Button0ID       equ     1       ; Button0‚МID
    22. Edit0ID         equ     2       ; EditBox0‚МID
    23. ;
    24. Button0XPos     equ     20
    25. Button0YPos     equ     20
    26. Button0Hight    equ     25
    27. Button0Width    equ     120
    28. Edit0XPos       equ     ( Button0XPos + Button0Width + 20 )
    29. Edit0YPos       equ     Button0YPos
    30. Edit0Hight      equ     25
    31. Edit0Width      equ     300
    32. TIMEOUT         equ     3        ;
    33. ;
    34. WinMain   proto :DWORD,:DWORD,:DWORD,:DWORD
    35. FD_ZERO   proto :DWORD
    36. FD_SET    proto :SOCKET,:DWORD
    37. FD_ISSET  proto :SOCKET,:DWORD
    38. localtime proto c:DWORD
    39. DDWORD STRUCT
    40.   Low_DD  DWORD  ?
    41.   High_DD DWORD  ?
    42. DDWORD ENDS
    43.  
    44. NTP_Packet STRUCT
    45.   Control_Word                  DWORD      ?
    46.   root_delay                    DWORD      ?
    47.   root_dispersion               DWORD      ?
    48.   reference_identifier          DWORD      ?
    49.   reference_timestamp           DDWORD    <>
    50.   originate_timestamp           DDWORD    <>
    51.   receive_timestamp             DDWORD    <>
    52.   transmit_timestamp_seconds    DWORD      ?
    53.   transmit_timestamp_fractions  DWORD      ?
    54. NTP_Packet ENDS
    55.  
    56. tm STRUCT
    57.   tm_sec   DWORD   ?  ; seconds after the minute - [0,59]
    58.   tm_min   DWORD   ?  ; minutes after the hour - [0,59]
    59.   tm_hour  DWORD   ?  ; hours since midnight - [0,23]
    60.   tm_mday  DWORD   ?  ; day of the month - [1,31]
    61.   tm_mon   DWORD   ?  ; months since January - [0,11]
    62.   tm_year  DWORD   ?  ; years since 1900
    63.   tm_wday  DWORD   ?  ; days since Sunday - [0,6]
    64.   tm_yday  DWORD   ?  ; days since January 1 - [0,365]
    65.   tm_isdst DWORD   ?  ; daylight savings time flag
    66. tm ENDS
    67. .data
    68. AppName         db      "SendMsg",NULL
    69. ClassName       db      "SendMsgClass",NULL
    70. ButtonClassName db      "button",NULL
    71. EditClassName   db      "edit",NULL
    72. Button0Caption  db      "Get SNTP Time!",NULL
    73. SNTPAddress     db      "0.ua.pool.ntp.org",NULL
    74. ;
    75. template1       db      "NTP Server Time : %d/%d/%d %d:%d:%d",NULL
    76. ;
    77. ErrMsg0         db      "Error[0]: WSACleanup s",NULL
    78. ErrMsg1         db      "Error[1]: WinSock‚",NULL
    79. ErrMsg2         db      "Error[2]: Socket",NULL
    80. ErrMsg3         db      "Error[3]: ",NULL
    81. ErrMsg4         db      "Error[4]: ",NULL
    82. ErrMsg5         db      "Error[5]: ",NULL
    83. ErrMsg6         db      "Error[6]: ",NULL
    84. ErrMsg7         db      "Error[7]: ",NULL
    85. ErrMsg8         db      "Error[8]: ",NULL
    86. ErrMsg9         db      "Error[9]: ",NULL
    87. ErrMsg10        db      "Error[10]:",NULL
    88. ErrMsg11        db      "Error[11]:",NULL
    89. ;
    90. NullData        db      NULL
    91. ;
    92. port            DWORD        123            ; unsigned short
    93. local_port      DWORD        1024           ; unsigned short
    94. .data?
    95. hInstance       HINSTANCE   ?
    96. CommandLine     LPSTR       ?
    97. ;
    98. wsaData         WSADATA     <>           ; STRUCT WSADATA(windows.inc)
    99. soc             DWORD       ?            ; int
    100. sockname        sockaddr_in <>           ; STRUCT sockaddr_in()
    101. serversockaddr  sockaddr_in <>           ; STRUCT sockaddr_in()
    102. serveraddr      DWORD       ?            ; unsigned long
    103. serverhostent   DWORD       ?            ; struct hostent *
    104. NTP_Send        NTP_Packet  <>           ;
    105. NTP_Recv        NTP_Packet  <>           ;
    106. waittime        timeval     <>           ;
    107. rdps            fd_set      <>           ;
    108. sockaddr_Size   DWORD       ?            ; int
    109. selret          DWORD       ?            ; int
    110. ntp_time        LONG        ?            ; long(4 Byte)
    111. NewNTP_Time     tm          <>
    112. lpNewNTP_Time   DWORD       ?            ; tmЌ\'ў'М‚Ц‚Мѓ|ѓCѓ"ѓ^
    113. ;
    114. hwndButton0     HWND        ?            ; Button‚МѓEѓBѓ"ѓhѓEѓnѓ"ѓhѓ‹
    115. hwndEdit0       HWND        ?            ; EditBox‚МѓEѓBѓ"ѓhѓEѓnѓ"ѓhѓ‹
    116. TextBuff0       db          64 dup( ? )
    117. .code
    118. start:
    119.         invoke GetModuleHandle, NULL                                    ; ѓ‚ѓWѓ...Ѓ[ѓ‹‚МЋж"ѕ
    120.         mov    hInstance,eax
    121.         invoke GetCommandLine                                           ; ѓRѓ}ѓ"ѓhѓ‰ѓCѓ"‚МЋж"ѕ
    122.         mov    CommandLine,eax
    123.         invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT      ; WinMain‚МЋАЌs
    124.         invoke ExitProcess,eax                                          ; ЏI-№ѓvѓЌѓZѓX
    125.  
    126. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    127.         LOCAL wc:WNDCLASSEX
    128.         LOCAL msg:MSG
    129.         LOCAL hwnd:HWND
    130.  
    131.         mov   wc.cbSize,SIZEOF WNDCLASSEX
    132.         mov   wc.style, CS_HREDRAW or CS_VREDRAW
    133.         mov   wc.lpfnWndProc, OFFSET WndProc
    134.         mov   wc.cbClsExtra,NULL
    135.         mov   wc.cbWndExtra,NULL
    136.         push  hInstance
    137.         pop   wc.hInstance
    138.         mov   wc.hbrBackground,COLOR_BTNFACE+1
    139.         mov   wc.lpszMenuName,NULL
    140.         mov   wc.lpszClassName,OFFSET ClassName
    141.         invoke LoadIcon,NULL,IDI_APPLICATION
    142.         mov   wc.hIcon,eax
    143.         mov   wc.hIconSm,eax
    144.         invoke LoadCursor,NULL,IDC_ARROW
    145.         mov   wc.hCursor,eax
    146.         invoke RegisterClassEx, addr wc
    147.         invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
    148.            WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
    149.            CW_USEDEFAULT,WindowWidth,WindowHight,NULL,NULL,\
    150.            hInst,NULL
    151.         mov   hwnd,eax
    152.         invoke ShowWindow, hwnd,SW_SHOWNORMAL
    153.         invoke UpdateWindow, hwnd
    154.         .WHILE TRUE                                     ; ѓЃѓbѓZЃ[ѓWѓ‹Ѓ[ѓv
    155.                 invoke GetMessage, ADDR msg,NULL,0,0    ; ѓЃѓbѓZЃ[ѓW‚МЋж"ѕ
    156.                 .BREAK .IF (!eax)
    157.                 invoke TranslateMessage, ADDR msg
    158.                 invoke DispatchMessage, ADDR msg
    159.         .ENDW
    160.         mov     eax,msg.wParam
    161.         ret
    162. WinMain endp
    163. ; API‚
    164. WndProc proc uses ebx ecx edx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    165.  
    166.         mov     eax,uMsg
    167.         .IF eax == WM_DESTROY
    168.                 invoke PostQuitMessage,NULL
    169.         .ELSEIF eax == WM_CREATE
    170.                 ;
    171.                 invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR Button0Caption,\
    172.                                       WS_CHILD or WS_VISIBLE or ES_CENTER,\
    173.                                       Button0XPos,Button0YPos,Button0Width,Button0Hight,\
    174.                                       hWnd,Button0ID,hInstance,NULL
    175.                 mov    hwndButton0,eax          ;
    176.                 ;
    177.                 invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
    178.                                       WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or \
    179.                                       ES_AUTOHSCROLL,\
    180.                                       Edit0XPos,Edit0YPos,Edit0Width,Edit0Hight,\
    181.                                       hWnd,Edit0ID,hInstance,NULL
    182.                 mov    hwndEdit0,eax           ;
    183.         .ELSEIF eax == WM_COMMAND
    184.                 mov    eax,wParam
    185.                 .IF eax == 0    ;
    186.                 ;
    187.                 .ELSE           ;
    188.                        .IF ax == Button0ID
    189.                            shr   eax,16
    190.                            .IF   ax  ==  BN_CLICKED  ;
    191.                                  call    GetSNTPTime
    192.                            .ENDIF
    193.                        .ENDIF
    194.                 .ENDIF
    195.         .ELSE
    196.                 invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    197.                 ret
    198.         .ENDIF
    199.         xor eax,eax
    200.         ret
    201. WndProc endp
    202. GetSNTPTime proc uses ebx ecx edx
    203.         ;
    204.         invoke  WSAStartup,101h,ADDR wsaData
    205.         .IF  eax != 0
    206.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg1
    207.              mov  eax,-1
    208.              ret
    209.         .ENDIF
    210.         ; UDP
    211.         invoke  socket,PF_INET,SOCK_DGRAM,0
    212.         mov  soc,eax
    213.         .IF  soc == INVALID_SOCKET
    214.              invoke  WSACleanup
    215.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg2
    216.              mov  eax,-1
    217.              ret
    218.         .ENDIF
    219.         ;
    220.         mov  sockname.sin_family,AF_INET
    221.         mov  sockname.sin_addr.S_un.S_addr,INADDR_ANY
    222.         invoke  htons,local_port
    223.         mov  sockname.sin_port,ax
    224.         invoke  MemCopy,ADDR NullData,ADDR sockname.sin_zero,sizeof sockname.sin_zero
    225.         ;
    226.         invoke  bind,soc,ADDR sockname,sizeof sockname
    227.         .IF  eax == SOCKET_ERROR
    228.              invoke WSAGetLastError
    229.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg3
    230.              invoke closesocket,soc
    231.              invoke WSACleanup
    232.              mov  eax,-1
    233.              ret
    234.         .ENDIF
    235.         invoke  inet_addr,ADDR SNTPAddress
    236.         mov  serveraddr,eax
    237.         .IF  serveraddr == -1
    238.              invoke gethostbyname ,ADDR SNTPAddress     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;       gethostbyname
    239.              mov  serverhostent,eax
    240.              .IF  serverhostent == NULL
    241.                   invoke SetWindowText,hwndEdit0,ADDR ErrMsg4
    242.                   invoke closesocket,soc
    243.                   invoke WSACleanup
    244.                   mov  eax,-1
    245.                   ret
    246.              .ELSE
    247.                   mov  eax,[eax + 12]         ; h_list
    248.                   mov  eax,[eax]
    249.                   mov  eax,[eax]              ; ip address
    250.                   mov  serveraddr,eax
    251.              .ENDIF
    252.         .ENDIF
    253.         ;
    254.         mov  serversockaddr.sin_family,AF_INET
    255.         mov  eax,serveraddr
    256.         mov  serversockaddr.sin_addr.S_un.S_addr,eax
    257.         invoke  htons,port                             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;htons
    258.         mov  serversockaddr.sin_port,ax
    259.         invoke  MemCopy,ADDR NullData,ADDR serversockaddr.sin_zero,sizeof serversockaddr.sin_zero
    260.         ;
    261.         invoke  htonl,0B000000h
    262.         mov  NTP_Send.Control_Word,eax
    263.         mov  NTP_Send.root_delay,0
    264.         mov  NTP_Send.root_dispersion,0
    265.         mov  NTP_Send.reference_identifier,0
    266.         mov  NTP_Send.reference_timestamp.Low_DD,0
    267.         mov  NTP_Send.reference_timestamp.High_DD,0
    268.         mov  NTP_Send.originate_timestamp.Low_DD,0
    269.         mov  NTP_Send.originate_timestamp.High_DD,0
    270.         mov  NTP_Send.receive_timestamp.Low_DD,0
    271.         mov  NTP_Send.receive_timestamp.High_DD,0
    272.         mov  NTP_Send.transmit_timestamp_seconds,0
    273.         mov  NTP_Send.transmit_timestamp_fractions,0
    274.         ;
    275.         invoke sendto ,soc,ADDR NTP_Send,sizeof NTP_Send ,0,\ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sendto
    276.                 ADDR serversockaddr,sizeof serversockaddr
    277.         .IF  eax == SOCKET_ERROR
    278.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg5
    279.              invoke closesocket,soc
    280.              invoke WSACleanup
    281.              mov  eax,-1
    282.              ret
    283.         .ENDIF
    284.         mov  waittime.tv_sec,TIMEOUT
    285.         mov  waittime.tv_usec,0
    286.         invoke FD_ZERO,ADDR rdps
    287.         invoke FD_SET,soc,ADDR rdps
    288.         invoke  select,FD_SETSIZE,ADDR rdps,NULL,NULL,ADDR waittime ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;select
    289.         .IF  eax == SOCKET_ERROR
    290.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg6
    291.              invoke closesocket,soc
    292.              invoke WSACleanup
    293.              mov  eax,-1
    294.              ret
    295.         .ENDIF
    296.         .IF  eax == 0
    297.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg7
    298.              invoke closesocket,soc
    299.              invoke WSACleanup
    300.              mov  eax,-1
    301.              ret
    302.         .ENDIF
    303.         invoke  FD_ISSET,soc,ADDR rdps
    304.         .IF  eax == FALSE
    305.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg8
    306.              invoke closesocket,soc
    307.              invoke WSACleanup
    308.              mov  eax,-1
    309.              ret
    310.         .ENDIF
    311.         mov  sockaddr_Size,sizeof serversockaddr
    312.         invoke  recvfrom,soc,ADDR NTP_Recv,sizeof NTP_Recv,0,ADDR serversockaddr,ADDR sockaddr_Size;;;;;;;recvfrom
    313.         .IF  eax == SOCKET_ERROR
    314.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg8
    315.              invoke closesocket,soc
    316.              invoke WSACleanup
    317.              mov  eax,-1
    318.              ret
    319.         .ENDIF
    320.         invoke  closesocket,soc
    321.         .IF  eax == SOCKET_ERROR
    322.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg11
    323.              invoke WSACleanup
    324.              mov  eax,-1
    325.              ret
    326.         .ENDIF
    327.         invoke  ntohl,NTP_Recv.transmit_timestamp_seconds
    328.         sub     eax,2208988800    ; 1970/01/01‚(c)‚з‚М•bђ"‚Й•ПЉ·
    329.         mov     ntp_time,eax
    330.         invoke  localtime,ADDR ntp_time
    331.         .IF  eax == NULL
    332.              invoke  SetWindowText,hwndEdit0,ADDR ErrMsg9
    333.              invoke  WSACleanup
    334.              mov  eax,-1
    335.              ret
    336.         .ENDIF
    337.         mov     lpNewNTP_Time,eax
    338.         invoke  MemCopy,lpNewNTP_Time,ADDR NewNTP_Time,sizeof NewNTP_Time   ; tmЌ\'ў'М‚рѓRѓsЃ[
    339.         ;
    340.         add  NewNTP_Time.tm_year,1900
    341.         add  NewNTP_Time.tm_mon,1
    342.         ; EditBox‚
    343.         invoke wsprintf,ADDR TextBuff0,ADDR template1,\
    344.                NewNTP_Time.tm_year,NewNTP_Time.tm_mon,NewNTP_Time.tm_mday,\
    345.                NewNTP_Time.tm_hour,NewNTP_Time.tm_min,NewNTP_Time.tm_sec
    346.         mov     ebx,eax
    347.         mov     TextBuff0[ ebx ],NULL
    348.         ;
    349.         invoke SetWindowText,hwndEdit0,ADDR TextBuff0
    350.         ;
    351.         invoke  WSACleanup
    352.         .IF  eax == SOCKET_ERROR
    353.              invoke SetWindowText,hwndEdit0,ADDR ErrMsg0
    354.              mov  eax,-1
    355.              ret
    356.         .ENDIF
    357.         xor eax,eax
    358.         ret
    359. GetSNTPTime endp
    360.  
    361. ;
    362. FD_ZERO proc uses ebx set:DWORD
    363.         mov  ebx,set
    364.         mov  DWORD PTR [ebx],NULL            ; fd_count = 0
    365.         xor  eax,eax
    366.         ret
    367. FD_ZERO endp
    368.  
    369. ;
    370. FD_SET proc uses ebx ecx edx fd:SOCKET,set:DWORD
    371.         mov  ebx,set
    372.         mov  eax,DWORD PTR [ebx]             ; Load fd_count
    373.         .IF  eax < FD_SETSIZE                ; fd_count < FD_SETSIZE
    374.              push ebx
    375.              mov  ecx,eax
    376.              inc  ecx
    377. @loop1:
    378.              add  ebx,sizeof SOCKET
    379.              loop @loop1
    380.              add  ebx,eax
    381.              mov edx,fd
    382.              mov DWORD PTR [ebx],edx
    383.              pop ebx
    384.              inc DWORD PTR [ebx]
    385.         .ENDIF
    386.         xor  eax,eax
    387.         ret
    388. FD_SET endp
    389.  
    390. ;
    391. FD_ISSET proc uses ebx ecx edx fd:SOCKET,set:DWORD
    392.         mov  ebx,set
    393.         mov  eax,DWORD PTR [ebx]             ; Load fd_count
    394.         mov  edx,fd
    395. ;
    396.         xor  ecx,ecx
    397. @loop1:
    398.         cmp  ecx,eax
    399.         jge  @no_find1
    400.         add  ebx,sizeof SOCKET
    401.         cmp  DWORD PTR [ebx],edx
    402.         je   @next1
    403.         inc  ecx
    404.         jmp  @loop1
    405. ;
    406. @no_find1:
    407.         mov  eax,FALSE
    408.         ret
    409. @next1:
    410.         mov  eax,TRUE
    411.         ret
    412. FD_ISSET endp
    413.  
    414. end start
    Ну запускаем и результат
    [​IMG]

    Фсио )))
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
  9. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Большое спасибо.
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    zxcc
    Пожалуйста )))