Seite 1 von 2

System-Zeit über das Internet aktualisieren

Verfasst: 05.06.2006 13:43
von Helle
Über obiges Thema habe ich in den PB-Foren Code-Beispiele gesucht; aber was ich fand hat entweder nicht funktioniert, blieb auf halber Strecke stehen oder es waren net-Befehle o.ä.
Daher war selbermachen angesagt:

Code: Alles auswählen

;-------- System-Zeit setzen mittels Time-Protokoll Port 37 TCP, übertragen von der Physikalisch-Technischen
;-------- Bundesanstalt (PTB) in Braunschweig
;-------- "Helle" K.Helbing 5.6.2006 PB 4.0

Global SysTime.SYSTEMTIME      ;PB-Structure
Global Verbindung.l 
Global Buffer.l 
Global Y.l
Global Z.l

If InitNetwork() 
     Buffer = AllocateMemory(4)
       If Buffer 
    
         Verbindung = OpenNetworkConnection("ptbtime1.ptb.de", 37)  ;oder ptbtime2, TCP ist Standard-Protokoll
           If Verbindung       ;bei erfolgreichem Verbindungsaufbau sendet die PTB 4 Bytes und schliesst die Verbindung
                                
             If ReceiveNetworkData(Verbindung, Buffer, 4)                        
               GetSystemTime_(SysTime)   ;muss aufgerufen werden für SetSystemTime! 
;-------- Umsetzung der empfangenen 4 Bytes vom Big-Endian- ins Little-Endian-Format              
               !MOV esi,[v_Buffer]
               !MOV eax,[esi]
               !BSWAP eax       ;in EAX steht danach folgender Sekunden-Wert: 2.272.060.800 (Unix-Startwert 1.1.1972, 00:00:00)
                                ;+ seit diesem Zeitpunkt aktuell vergangene Sekunden    
;-------- Zeit setzen            
               !XOR edx,edx
               !MOV ebx,86400   ;60*60*24 Sekunden pro Tag
               !DIV ebx         ;EAX enthält danach die vergangenen Tage seit dem 1.1.1900 (war Startwert 0) 
               !MOV [v_Y],edx   ;EDX enthält als "Restwert" die seit Mitternacht vergangenen Sekunden
               !MOV [v_Z],edx   
               
               Y = Y / 3600            ;verbliebende "Tages-Sekunden" in Stunden umrechnen   
               SysTime\wHour = Y       ;Stunden setzen
  
               Z = Z - Y * 3600        ;diese "verbrauchten" Sekunden vom Rest abziehen
               Y = Z
               Z = Z / 60              ;die restlichen Sekunden in Minuten umrechnen
               SysTime\wMinute = Z     ;Minuten setzen  
    
               Z = Y - Z * 60          ;der übrig gebliebene Rest sind die Sekunden 
               SysTime\wSecond = Z     ;Sekunden setzen
       
               SetSystemTime_(SysTime) ;vorher muss GetSystemTime aufgerufen werden!
             EndIf                     ;Im Gegensatz zu SetLocalTime berücksichtigt SetSystemTime 
                                       ;die Zeitzone sowie Winter/Sommer-Zeit! 
           Else 
             OpenConsole()
             PrintN("Verbindung mit Braunschweig nicht zustande gekommen!") 
             Delay(60000) 
             CloseConsole()
           EndIf 
     
       FreeMemory(Buffer) 
     EndIf
EndIf
End
 
Es wird hier nur die Zeit aktualisiert, Datum wäre aber auch möglich (lohnt hier aber wohl nicht).

Gruss
Helle
Edit: Am 6.5.2006 nur Kosmetik

Verfasst: 08.06.2006 18:54
von PBZecke
Wäre nett, wenn Du das mit dem Datum der Vollständigkeit auch noch
integrieren könntest. ASM ist leider ein Fremdwort für mich :oops:

Verfasst: 08.06.2006 19:02
von a14xerus
bei mir kommt, das in zeile mit der "zeit nach mitternacht" ein fehler ist:
undefined symbol

warum?

Verfasst: 09.06.2006 10:06
von Helle
Hier die Version mit Datum. Die Umrechnungen habe ich auch PB überlassen.

Code: Alles auswählen

;-------- System-Zeit setzen mittels Time-Protokoll Port 37 TCP, übertragen von der Physikalisch-Technischen
;-------- Bundesanstalt (PTB) in Braunschweig
;-------- "Helle" K.Helbing 9.6.2006 PB 4.0

Global SysTime.SYSTEMTIME      ;PB-Structure
Global Verbindung.l 
Global Buffer.l 
Global Time.l

If InitNetwork() 
     Buffer = AllocateMemory(4)
       If Buffer 
    
         Verbindung = OpenNetworkConnection("ptbtime1.ptb.de", 37)  ;oder ptbtime2, TCP ist Standard-Protokoll
           If Verbindung       ;bei erfolgreichem Verbindungsaufbau sendet die PTB 4 Bytes und schliesst die Verbindung
                                
             If ReceiveNetworkData(Verbindung, Buffer, 4)                        
               GetSystemTime_(SysTime)   ;muss aufgerufen werden für SetSystemTime! 
;-------- Umsetzung der empfangenen 4 Bytes vom Big-Endian- ins Little-Endian-Format              
               !MOV esi,[v_Buffer]
               !MOV eax,[esi]
               !BSWAP eax              ;in EAX stehen die seit dem 1.1.1900 vergangenen Sekunden     

;-------- Zeit und Datum setzen            
               !SUB eax,2208988800     ;um auf PB-Niveau zu kommen, Nullpunkt für PB ist der 1.1.1970
               !MOV [v_Time],eax

                SysTime\wYear = Year(Time)
                SysTime\wMonth = Month(Time)
                SysTime\wDay = Day(Time)
                SysTime\wHour = Hour(Time)
                SysTime\wMinute = Minute(Time)
                SysTime\wSecond = Second(Time)
  
               SetSystemTime_(SysTime) ;vorher muss GetSystemTime aufgerufen werden!
             EndIf                    ;Im Gegensatz zu SetLocalTime berücksichtigt SetSystemTime 
                                       ;die Zeitzone sowie Winter/Sommer-Zeit 
           Else 
             OpenConsole()
             PrintN("Verbindung mit Braunschweig nicht zustande gekommen!") 
             Delay(60000) 
             CloseConsole()
           EndIf 
     
       FreeMemory(Buffer) 
     EndIf
EndIf
End
Wenn der Code richtig kopiert wird sollte alles funktionieren!

Gruss
Helle
Edit am 11.6.2006 nur Kosmetik

Verfasst: 09.06.2006 10:14
von DarkDragon

Verfasst: 09.06.2006 10:26
von Helle
@DD: Das war eines der Beispiele, die bei mir nicht funzten! Über Port 13 konnte ich keine Verbindung herstellen; kann natürlich auch an meinem Netz-Anbieter liegen. Port 37 ging sofort. Ausserdem sind die Mechanismen Port13/Port37 völlig unterschiedlich.

Gruss
Helle

Verfasst: 09.06.2006 10:58
von DarkDragon
Bei mir funzt das auch nicht, aber ich dachte es wären nur die Server offline.

Verfasst: 09.06.2006 11:26
von stbi
Helle hat geschrieben:@DD: Das war eines der Beispiele, die bei mir nicht funzten! Über Port 13 konnte ich keine Verbindung herstellen; kann natürlich auch an meinem Netz-Anbieter liegen. Port 37 ging sofort. Ausserdem sind die Mechanismen Port13/Port37 völlig unterschiedlich.
sind auch unterschiedliche Protokolle, die sicher auch nicht jeder Server servt ...

Port 13 = daytime (liefert hh:mm:ss als ASCII-Zeichen)
Port 37 = time (liefert Sekunden seit 1.1.1900 als 32 Bit-Binärwert)
Port 123 = ntp (liefert Sekunden und Bruchteile (Nano- oder Picosekunden?) seit 1.1.1900 als 64 Bit-Binärwert)

Ntp dürfte das gebräuchlichste Protokoll sein, Clienst sind bei den meisten Betriebssystemen dabei, auch bei Windows. Daytime ist ein Relikt und das time-Protokoll dürften auch nur noch sehr wenige einsetzen, da es eben "nur" sekundengenau ist.

Verfasst: 09.06.2006 11:52
von PBZecke
@Helle, Danke :allright:

Verfasst: 15.07.2006 18:28
von a14xerus
das mit dem ASM Fehlern beim kompilieren liegt nicht am falschen kompilieren, sondern an eienr veralteten FAsm.exe im PureBasic Ordner.
Downlaod der neuesten hier:
http://flatassembler.net/download.php