Durch exakte Uhrzeit aus dem Internet die Systemuhr stellen lassen
-
Hi,
ich möchte ein Programm schreiben, das
1. sich aus dem Internet die aktuelle Uhrzeit holt und
2. die Systemzeit aktualisiert.
Ich weiß bloß nicht, wie ich Punkt 1 realisieren soll. Kann mir da einer helfen?
-
WebFritzi schrieb:
Hi,
ich möchte ein Programm schreiben, das
1. sich aus dem Internet die aktuelle Uhrzeit holt und
2. die Systemzeit aktualisiert.
Ich weiß bloß nicht, wie ich Punkt 1 realisieren soll. Kann mir da einer helfen?Hast Du den Petzold, da wird so ein Programm erstellt. Falls nicht dann google mal nach Time Protocol (RFC 868).
Ich poste mal hier wie der Ablauf in Petzold beschrieben ist:
1. Eine Verbindung mit Port 37 eines Servers herstellen, der diesen Dienst unterstützt
2. Auf einen 32-Bit-Wert warten, der die Zahl der seit dem 1.1.1900 um 0:00:00 Uhr verstrichene Sekunden angibt.
3. Die Verbindung beenden.
-
bevor du anfängst solltest du einen server finden der die richtige zeit anbietet.
-
Aha, mhm... Ich werds mal probieren...
-
Riskiere doch mal eine Blick auf http://www.ntp.org/ !
Ich weiß zwar nicht ob es ntptimeset, ntpd und Konsorten auch für Windows gibt, aber die protokollspezifischen Sachen kannst Du auf alle Fälle übernehmen bzw. viel von ihnen lernen...
-
Alternativ geht auch Port 13, aber da kommt ein String zurück. Zum Beispiel so (in Java):
import java.net.*; import java.io.*; public class Daytime { public static void main(String[] args) { try { Socket socket = new Socket ("www.uni-hamburg.de",13); InputStream stream = socket.getInputStream(); int len; byte [] bytes = new byte [50]; while ((len = stream.read(bytes)) != -1) { System.out.write(bytes,0,len); } stream.close(); socket.close(); System.out.println(); } catch (IOException e) { System.out.println (e); } } }
Ausgabe:
Thu Aug 7 23:39:06 2003
Klappt aber wie gesagt nicht mit jedem Host. Dieses Programm terminiert nichtmal, wenn du es mit einem falschen Host versuchst.
-
Mal eine ganz dumme Frage: Hat nicht sogar Windows mittlerweile einen eigenen NTP-Client an Board? Das ist nämlich eine technisch weit sauberere Lösung als diese daytime-Geschichte...
-
Naja, meine Synchronisation soll garnicht sooo genau sein. Ein paar Sekunden dürfen ruhig flöten gehen. Und alle Server (z.B. alle auf http://www.eecis.udel.edu/~mills/ntp/clock1a.html) geben die Zahl der seit dem 1.1.1900 um 0:00:00 Uhr verstrichenen Sekunden zurück, wenn man sie auf Port 37 anspricht, ja?
-
WebFritzi schrieb:
Naja, meine Synchronisation soll garnicht sooo genau sein. Ein paar Sekunden dürfen ruhig flöten gehen.
Dann brauchst Du nicht unbedingt NTP obwohl es natürlich trotzdem eine sehr elegante Lösung darstellt.
Und alle Server (z.B. alle auf http://www.eecis.udel.edu/~mills/ntp/clock1a.html) geben die Zahl der seit dem 1.1.1900 um 0:00:00 Uhr verstrichenen Sekunden zurück, wenn man sie auf Port 37 anspricht, ja?
Epochsekunden? Eigentlich glaube ich dass das ganze ein bisschen komplizierter abläuft aber ich habe die entsprechenden RFCs auch noch nicht gelesen. *g*
-
Since NTP timestamps are cherished data and, in fact, represent the main
product of the protocol, a special timestamp format has been
established. NTP timestamps are represented as a 64-bit unsigned fixed-
point number, in seconds relative to 0h on 1 January 1900. The integer
part is in the first 32 bits and the fraction part in the last 32 bits.
This format allows convenient multiple-precision arithmetic and
conversion to Time Protocol representation (seconds), but does
complicate the conversion to ICMP Timestamp message representation
(milliseconds). The precision of this representation is about 200
picoseconds, which should be adequate for even the most exotic
requirements.ftp://ftp.rfc-editor.org/in-notes/rfc1305.txt
-
Simpel aber nicht ganz so einfach zu automatisieren gibts auch noch das hier:
-
Sorry, habe mich geirrt, sind tatsächlich Sekunden seit 1900 und nicht Unix-Epoch + nochwas, wenn RFCs nur nicht manchmal so mühsam zu lesen wären...
edit: Hm, zu spät. Geistige Notiz an mich: Nicht mehr so lange Tabs offen lassen und mit dem Beantworten warten...
-
http://www.luckie-online.de/ -> InetTime.
-
Luckie schrieb:
http://www.luckie-online.de/ -> InetTime.
Wenn du auch noch sagen könntest, wie DU das bewerkstelligt hast, wäre das echt super.
P.S.: Komisch, ich will immer Programme schreiben, die du schon längst geschrieben hast. (siehe z.B. NetSend)
-
Ich kann dich beruhigen WebFritzi - es ist nicht leicht, was zufinden, was es nicht gibt. Ich glaub sogar Dönerbudensimulationen, Mückenpopulationsberechnung und eine Berechnung wieviel Toilettenpapier man in der Woche braucht ( in cm^2 ) gibts schon. Auch wenn ich selbst noch keine gesehen habe
-
WebFritzi schrieb:
Luckie schrieb:
http://www.luckie-online.de/ -> InetTime.
Wenn du auch noch sagen könntest, wie DU das bewerkstelligt hast, wäre das echt super.
Source ist doch dabei. Ist zwar Delphi-Language aber die API-Funktionen heißen genauso. Kommentiert ist der Source, glaube ich, auch noch.
P.S.: Komisch, ich will immer Programme schreiben, die du schon längst geschrieben hast. (siehe z.B. NetSend)
Einer ist immer schneller. :p
-
#ifndef TimeSyncH #define TimeSyncH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <NMDayTim.hpp> #include <Psock.hpp> #include <ExtCtrls.hpp> #include <Graphics.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TNMDayTime *time; TButton *Button1; TButton *Button2; TEdit *Edit1; TImage *Image1; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall VerbFehler(TObject *Sender); void __fastcall WrongHost(bool &Handled); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- #include <vcl.h> #include <dos.h> #pragma hdrstop #include "TimeSync.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; AnsiString output="Uhrzeit: "; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- /*Edit1->Text=time->DayTimeStr ; AnsiString tmp=Edit1->Text; int i=1; while(tmp[i++]!=' '); while(tmp[i++]!=' '); while(tmp[i++]!=' '); test->Text=Edit1->Text.SubString(i,8); struct time t; t.ti_hour=StrToInt(test->Text.SubString(1,2)); t.ti_min=StrToInt(test->Text.SubString(4,2)); t.ti_sec=StrToInt(test->Text.SubString(7,2)); settime(&t);*/ void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString tmp=time->DayTimeStr; int i=1; while(tmp[i++]!=' '); while(tmp[i++]!=' '); while(tmp[i++]!=' '); Edit1->Text=output+tmp.SubString(i,8); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString tmp=time->DayTimeStr; int i=1; while(tmp[i++]!=' '); while(tmp[i++]!=' '); while(tmp[i++]!=' '); Edit1->Text=output+tmp.SubString(i,8); tmp=tmp.SubString(i,8); struct time t; t.ti_hour=StrToInt(tmp.SubString(1,2)); t.ti_min=StrToInt(tmp.SubString(4,2)); t.ti_sec=StrToInt(tmp.SubString(7,2)); settime(&t); } //--------------------------------------------------------------------------- void __fastcall TForm1::VerbFehler(TObject *Sender) { Edit1->Text="Verbindungsfehler"; } //--------------------------------------------------------------------------- void __fastcall TForm1::WrongHost(bool &Handled) { Edit1->Text="Host Fehler"; } //---------------------------------------------------------------------------
-
Bei mir (BCB3) gibt es kein TNMDayTime-Objekt. Ich würde das auch gerne auf LowLevel-Ebene über Sockets machen.
@unreg: Wo werden denn bitte die Funktionen "VerFehler" und "WrongHost" aufgerufen?
-
Meins ist low level.
-
Luckie schrieb:
Meins ist low level.
Und genau deswegen werd ich mir das auch mal anschauen. Sorry, ich wusst nicht, dass da auch der Code dabei ist.