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.
Ü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:
;-------- 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).
;-------- 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.
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.
@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.
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.
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."
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