Deutsch
Units

Daytime Protocol Unit - Internetzeit über Zeitserver

 

Andre
Rohland
Hallo liebe Community,

ich bin schon ein ziemlich alter Profan - Dino ( seit Version 5.5 ).
Die Entwicklung von Profan habe ich bis zur aktuellen Version stets aufmerksam und begeistert verfolgt, allerdings immer nur im Background, weil ich mich mal mit Thomas Hölzer gefetzt und mir dafür nicht wirklich Komplimente der damaligen Profanergruppe eingefangen habe... .

Zur Zeit bastle ich an einem Programm, welches erfordert, dass die Systemzeit möglichst genau aktualisiert, bzw. abgerufen wird.

Dafür habe ich bereits mehrere Lösungsansätze gesehen, allerdings kamen sie mir zum Teil als:
1. zu kompliziert und
2. zu groß
vor, besonders wenn man nur die aktuelle Zeit beötigt.

Gott sei Dank gibt es immer noch Server, die die aktuelle Zeit und das Datum über das sogenannte Daytime-Protocol als String zurückgeben. Der Nachteil ist nur, dass dieses Protokoll nicht eindeutig definiert ist, so dass verschiedene Server auch verschiedene Strings zurückgeben... .

Vielleicht kann jemand von Euch diese Unit gebrauchen, ich würde mich darüber freuen.
Quelltext gibt es natürlich auf Anfrage... .

Viele Grüße
André Rohland

7 kB
Hochgeladen:02.02.2009
Ladeanzahl263
Herunterladen
 
02.02.2009  
 



Grüße! NTP  [...]  ist tatsächlich ziemlich wirrig.


Quelltext gibt es natürlich auf Anfrage... .


Anfrage!
 
03.02.2009  
 




Andre
Rohland
Habe den Quelltext noch ein wenig kommentiert.
Inettime
 $L
Def WSAStart(2) !wsock32.dll,WSAStartup
Def socket(3) !wsock32.dll,socket
Def WSAAsyncSelect(4) !wsock32.dll,WSAAsyncSelect
Def htons(1) !wsock32.dll,htons
Def connect(3) !wsock32.dll,connect
Def gethostbyname(1) !wsock32.dll,gethostbyname
Def recv(4) !wsock32.dll,recv
Def ioctlsocket(3) !wsock32.dll,ioctlsocket
Def closesocket(1) !wsock32.dll,closesocket
Def WSAClean(0) !wsock32.DLL,WSACleanup
Def WSAGetLastError(0) !wsock32.dll,WSAGetLastError
Def RtlMoveMemory(3) !kernel32,RtlMoveMemory
Def InternetGetConnectedState(2) !WININET.DLL,InternetGetConnectedState
Def SetSystemTime(1) !KERNEL32,SetSystemTime
Def SetLocalTime(1) !KERNEL32,SetLocalTime
USERMESSAGES 4100    Message, die auftritt, wenn ein Netzwerkereignis stattfindet (WSAAsyncSelect)

proc ?_getTime

    parameters netadr$,netport&,count&,pointer&,erlaubt&
    Winsock - Variablen
    declare wsaerror&,Inetadresse#,sockaddr_in#,zwbuf#,avdat&
    declare dummy&,hostent#,xnetport&,xnetorderadr&,wsadata#,mysocket&
    dim Inetadresse#,255
    dim wsadata#,526
    dim sockaddr_in#,16
    dim hostent#,$5000
    Kontrolle und Steuerung
    declare  ende%,ergebnis$,tstring$
    Systemzeit etc
    declare wYear%,wMonth%,wDay%,wHour%,wMinute%,wSecond%
    ergebnis$ =
    Bich ich (schon) drin ???

    ifnot InternetGetConnectedState(0,0)

        ergebnis$ = error 1
        return ergebnis$

    endif

    Winsock.dll initialisieren
    clear wsadata#

    if WSAStart($101,wsadata#)

        ergebnis$ = error 2
        return ergebnis$

    endif

    Streamsocket erzeugen
    P1: (AF_INET = 2) Internet Protokoll version 4 (IPv4) Adressfamilie/// P2: (SOCK_STREAM = 1)
    es soll ein Streamsocket erzeugt werden/// P3: 0 - Provider bestimmt das Protokoll
    mysocket&=socket(2,1,0)

    if mysocket& = -1

        ergebnis$ = error 3
        WSAClean()
        return ergebnis$

    endif

    Nonblocking modus / Usermessage übergeben

    if WSAAsyncSelect(mysocket&,%hwnd,4100,$1) <> 0

        ergebnis$ = error 4
        closesocket(mysocket&)
        WSAClean()
        return ergebnis$

    endif

    clear Inetadresse#
    string Inetadresse#,0=netadr$
    dummy&=gethostbyname(Inetadresse#)     liefert Pointer auf Hostent - Struktur

    if dummy& = 0                          Internetadresse konnte nicht gefunden/ aufgelöst werden

        ergebnis$ = error 5
        closesocket(mysocket&)
        WSAClean()
        return ergebnis$

    endif

    clear hostent#
    Kopieren der Infos aus der hostent - Struktur ( dummy& ) in die eigene Bereichsvariable hostent#
    RtlMoveMemory(hostent#,dummy&,16)
    dummy&=long(hostent#,12)
    RtlMoveMemory(hostent#,dummy&,4)
    dummy&=long(hostent#,0)
    RtlMoveMemory(hostent#,dummy&,255)
    xnetorderadr&=long(hostent#,0)
    xnetport&=htons(netport&)
    Struktur für winsock connect (Protokoll, Port, Adresse ) füllen
    word sockaddr_in#,0=2 AF_inet
    word sockaddr_in#,2=xnetport&
    long sockaddr_in#,4=xnetorderadr&
    Streamsocket verbinden...
    wsaerror& = connect(mysocket&,sockaddr_in#,16)

    if wsaerror& = -1

        wsaerror& = WSAGetLastError()

        ifnot (wsaerror& = 10035) | (wsaerror& = 0)  0 = kein Fehler, 10035 = WSAWOULDBLOCK, diese

            ergebnis$ = error 6                       Meldung erfolgt wegen dem NonBlocking - Modus,
            closesocket(mysocket&)                      ist aber für uns unbeachtlich
            WSAClean()
            return ergebnis$

        endif

    endif

    Die nachfolgende Schleife könnte abgeändert werden, indem z.B. SLEEP count& (= Parameter P3)
    verwendet und die Anzahl der Durchläufe herabgesetzt wird
    ebenso könnte auch die USERMESSAGE 4100 abgefragt werden, für den von mir beabsichtigten Zweck
    genügte diese Variante ( i.d.R. liegt ein Ergebnis nach etwa 50 Durchläufen vor ).

    if ergebnis$ =

        avdat&=0

        Whileloop count&

            ioctlsocket(mysocket&,$4004667F,addr(avdat&))  $4004667F = FIONREAD - prüft ob Daten empfangen

            if avdat& > 0                                  wurden und gibt die Anzahl in avdat& zurück

                dim zwbuf#,avdat&
                clear zwbuf#
                recv(mysocket&,zwbuf#,avdat&,0)               liest die Anzahl der empfangenen Daten (avdat&)
                break                                         in zwbuf# ein

            endif

        endwhile

        if avdat& > 0

            ergebnis$ = string$(zwbuf#,0)
            ergebnis$=translate$(ergebnis$,chr$(13)+chr$(10),)   Carriage return / Line Feed entfernen

            ifnot pointer&=0                              Parameter 4 der Unit, pointer& ist die Adresse

                wYear% = val(right$(ergebnis$,4))            einer übergebenen SystemTime - Struktur
                RtlMoveMemory(pointer&,addr(wYear%),2)       Struktur wird gefüllt....
                case instr(JAN,Upper$(ergebnis$)) : wMonth% = 1
                case instr(FEB,Upper$(ergebnis$)) : wMonth% = 2
                case instr(MAR,Upper$(ergebnis$)) : wMonth% = 3
                case instr(APR,Upper$(ergebnis$)) : wMonth% = 4
                case instr(MAY,Upper$(ergebnis$)) : wMonth% = 5
                case instr(JUN,Upper$(ergebnis$)) : wMonth% = 6
                case instr(JUL,Upper$(ergebnis$)) : wMonth% = 7
                case instr(AUG,Upper$(ergebnis$)) : wMonth% = 8
                case instr(SEP,Upper$(ergebnis$)) : wMonth% = 9
                case instr(OCT,Upper$(ergebnis$)) : wMonth% = 10
                case instr(NOV,Upper$(ergebnis$)) : wMonth% = 11
                case instr(DEC,Upper$(ergebnis$)) : wMonth% = 12
                RtlMoveMemory(pointer&+2,addr(wmonth%),2)
                wDay% = val(substr$(ergebnis$,3,chr$(32)))
                RtlMoveMemory(pointer&+6,addr(wDay%),2)
                tstring$ = substr$(ergebnis$,4,chr$(32))
                wHour% = val(substr$(tstring$,1,:))
                RtlMoveMemory(pointer&+8,addr(wHour%),2)
                wMinute% = val(substr$(tstring$,2,:))
                RtlMoveMemory(pointer&+10,addr(wMinute%),2)
                wSecond% = val(substr$(tstring$,3,:))
                RtlMoveMemory(pointer&+12,addr(wSecond%),2)

            else

                erlaubt& = 0                        Keine Struktur übergeben, also keine Erlaubnis zum
                endif                                Setzen der Systemzeit = ignoriere Parameter 5

            else

                ergebnis$ = error 7           es wurden keine Daten empfangen

            endif

            closesocket(mysocket&)
            WSAClean()

        endif

        if erlaubt&                             Parameter 5 der Unit: Setzen der Systemzeit erlaubt

            SetSystemTime(pointer&)
            dummy& = SetLocalTime(pointer&)
            casenot dummy& : ergebnis$ = error 8     Fehler beim Setzen der System ( lokalen ) Zeit

        endif

        return ergebnis$

    endproc

 
03.02.2009  
 




Andre
Rohland
Nanüchen...

Unit wurde 10 mal heruntergeladen, kommentierter Quelltext wurde zu Verfügung gestellt.

Wirklich keine Bemerkungen, Hinweise o.ä. ?
 
04.02.2009  
 




RGH
Hallo Andre,

gib den Leuten doch ewas Zeit, sich damit zu befassen.
Ich lade oft was herunter, um dann erst sehr viel später - manchmal sind es Monate - dazu zu kommen, mich damit zu befassen. Und manches wird geladen, kommt aber mangels Gelegenheit nie zum Einsatz. Sind halt nicht alles Schüler, Studenten oder Rentner mit viel Zeit hier ...

Gruß
Roland
(der befürchtet, auch dereinst als Rentner nicht so viel Zeit zu haben, wie er gerne hätte und als Student nicht das nötige Geld hatte, um die Zeit so zu nutzen, wie er es damals gerne getan hätte)
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.02.2009  
 



Ich lehne den Gedanken ab, dass Roland jemals Rentner ist.

@Andre: Mit der Zeit werden das sicher dutzende Downloads. Dennoch, wir brauchen einen weiteren Schlachtplan, viel viel mehr XProfaner zu gewinnen.
 
04.02.2009  
 



Funkt. super!
 
04.02.2009  
 




Andre
Rohland
O.k., O.k. habe ich kapiert...

Ich wollte wirklich nicht rumningeln und drängeln, ich hatte mich nur ein wenig gewundert.
IF hatte doch auf meinen ersten Post ( Quelltext gibts auf Anfrage ) prompt mit Anfrage! geantwortet und ich hatte nun irgendwie ein wenig Bammel, daß vielleicht etwas nicht funzt.

@Roland: Toll, Dich wieder persönlich zu lesen. Bitte aber nicht  vom alten Profan - Dino aus dem ersten Post irreführen lassen, ich bin ( mit viel Glück ) vielleicht in 23 Jahren Mitglied Deiner dritten Kategorie (Rentner) . Bis dahin arbeite ich noch als Trainer an Grundschulen mit Kindern. Zur Zeit sind hier in Berlin-Brandenburg Schulferien, was vielleicht meinen augenblicklich übermäßigen Zeitfonds erklärt... .

@IF: Es ging mir wirklich weniger um die Zahl der Downloads, als vielmehr darum, daß die Unit auch richtig funkioniert und brauchbar ist.
Bezüglich Schlachtplan :
Ist ein ziemlich komplexes Thema, an dem ich durchaus interessiert bin. Schlage vor, wir belasten diesen Beitrag damit nicht, sondern machen entweder einen neuen Beitrag auf, oder unterhalten uns direkt per eMail. Wir könnten so zum Beispiel Vorstellungen austauschen, gemeinsam darüber lachen und im Ergebnis vielleicht doch eine gute Strategie finden... .
 
04.02.2009  
 




Andre
Rohland
Doch noch ein wichtiger Hinweis...

In meinem Programm, in welchem ich die Unit verwende, werden alle drei Zeitserver der Uni Braunschweig abgefragt. Im Falles eines Mißerfolgs wird die Abfrage alle drei Minuten erneut durchgeführt.

Nach Kompilieren und Linken zur ausführbaren *.exe Datei konnte auch nach 20 Minuten noch keine Verbindung zu den Zeitservern hergestellt werden, obwohl im Interpreter alles tadellos klappte.

Die Ursache:
Ich verwende Total Care von GDATA (Antivirus + Firewall). Nach dem Linken mit dem Runtime-Modul blockte die Firewall die Verbindung, was sie mir gemeinerweise natürlich nicht anzeigte... .

Solltet Ihr also solche Probleme haben überprüft bitte zuerst Eure Einstellungen für Euer Antivirusprogramm, bzw. die Firewall(s).

In meinem Falle genügte ein einfacher Scan mit der Antivirus-Komponente von GDATA Total Care, um mein fertiges Programm als vertrauenswürdig einzustufen, danach klappte wieder alles beim ersten Versuch.

mfG
André
 
12.02.2009  
 




E.T.
Moin,
hab dies mal ausgegraben, weil ich nach genau so etwas suche.
Bringe aber das Beispiel irgendwie nicht zum laufen

Oder jemand 'ne andere Idee, die Systemzeit per Internet zu stellen ??

Hintergrund:
Mein Rechner für meine Wetterstation hat nach einem Neustart (bzw. kurzzeitigem Stromausfall) immer unsinnige Zeit-Einstellungen.
Wohl der Akku hin, lässt sich auf 'nem Mini-PC (Orbsmart) auch nicht so einfach wechseln).
Mit Win-eigenen Mitteln komm ich nicht zuverlässig weiter, die Systemzeit sicher nach dem Rechner-Start zu stellen: mal klappts, öffters aber auch nicht.

Da die Software für meine Wetterstation (und Auswertung etc.) eh nach dem Start von WIN 8.1 von einem XProfan-Programm der Reihe nach gestartet wird, war so der Gedanke, doch vor dem starten der relevanten Programme gleich die Zeit vorher mit irgendeinem Server zu syncronisieren.
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
15.06.2020  
 




Matthias
Arlt
Das obige Beispiel will bei mir auch nicht so recht...
Eine andere Möglichkeit bestünde über die Kommandozeile wie folgt:

net time /setsntp:ptbtime2.ptb.de
w32tm /resync

Der Zeitserver ist natürlich variabel (nicht alle funktionieren immer).
Das lässt sich dann auf unterschiedliche Weise automatisieren.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
15.06.2020  
 




E.T.
Matthias Arlt (15.06.2020)
net time /setsntp:ptbtime2.ptb.de
w32tm /resync


Funktioniert auch nicht, wie es soll.
Irgendwie startet mein 8.1 den "Zeitdienst" erst etliche Zeit nach dem Start / Neustart, das lässt sich unter Dienste auch nicht ändern (trotz "Start sofort" immer noch eine Ewigkeit später).
Deshalb funzt diese Variante auch nicht sicher, und Erfolg oder Misserfolg kann auch nicht kontrolliert werden.
 
XProfan X3
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
15.06.2020  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

16.493 Betrachtungen

Unbenanntvor 0 min.
E.T.09.12.2022
Georg Teles01.10.2022
RAW05.06.2022
Member 640534316.04.2022
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie