System-Zeit über das Internet aktualisieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

System-Zeit über das Internet aktualisieren

Beitrag 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
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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:
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

bei mir kommt, das in zeile mit der "zeit nach mitternacht" ein fehler ist:
undefined symbol

warum?
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Zuletzt geändert von Helle am 11.06.2006 06:42, insgesamt 1-mal geändert.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Bei mir funzt das auch nicht, aber ich dachte es wären nur die Server offline.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag von PBZecke »

@Helle, Danke :allright:
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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
Antworten