Units | | | | 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 |
| | | | |
| | | | | | | |
| | 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
|
| | | | |
| | Andre Rohland | Nanüchen...
Unit wurde 10 mal heruntergeladen, kommentierter Quelltext wurde zu Verfügung gestellt.
Wirklich keine Bemerkungen, Hinweise o.ä. ? |
| | | | |
| | 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. |
| | | | |
| | | | | | | |
| | 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... . |
| | | | |
| | 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é |
| | | | |
| | 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 X3Grüß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 ▲ |
| |
|
AntwortenThemenoptionen | 16.516 Betrachtungen |
ThemeninformationenDieses Thema hat 6 Teilnehmer: |