Seite 1 von 2

Atomzeit aus dem Internet - Mein erstes Programm fürs Forum

Verfasst: 15.07.2007 17:09
von PsionMan
Hallo,

Program welches die Zeit von eimem Zeitserver holt!

Vieleich kann das ja einer brauchen ?

P.S. Debug ein

Hier also mein Einstieg!

Code: Alles auswählen

Procedure INetEin()               ; Stellt Internetverbindung für OpenNetworkConnection her !
  If InitNetwork() = 0 
    MessageRequester("Fehler", "Internetverbindung fehlgeschlagen !!!")
    End
  EndIf  
EndProcedure

Procedure.d AtomFaktor()          ; Holt die vergangenen Sekunden seit 1.1.1900 von eimen Zeitserver
  Buffer1 = AllocateMemory(1)     
  Buffer2 = AllocateMemory(1)     ; Reserviert 4 x 1 Byte zum empfangen der Daten! 
  Buffer3 = AllocateMemory(1)
  Buffer4 = AllocateMemory(1)
  
  ConnectionID = OpenNetworkConnection("131.188.34.45", 37,#PB_Network_TCP)  ; öffnet Verbindung zum Zeit-Server
  
  If ConnectionID 
    ReceiveNetworkData(ConnectionID, Buffer1, 1)      ; Schreibt 1. empfangenes Byte in Buffer1
    Byte1.q=PeekB(Buffer1)& $FF                       ; Schreibt Inhalt von Buffer1 in (quad)Variabel Byte1
    Byte1=Byte1<<24                                   ; Multipliziert Byte1 mit 255*255*255
    
    ReceiveNetworkData(ConnectionID, Buffer2, 1)      ; Schreibt 2. empfangenes Byte in Buffer2
    Byte2.q=PeekB(Buffer2)& $FF                       ; Schreibt Inhalt von Buffer2 in (quad)Variabel Byte2
    Byte2=Byte2<<16                                   ; Multipliziert Byte2 mit 255*255
    
    ReceiveNetworkData(ConnectionID, Buffer3, 1)      ; Schreibt 3. empfangenes Byte in Buffer3
    Byte3.q=PeekB(Buffer3)& $FF                       ; Schreibt Inhalt von Buffer3 in (quad)Variabel Byte3
    Byte3=Byte3<<8                                    ; Multipliziert Byte2 mit 255
    
    ReceiveNetworkData(ConnectionID, Buffer4, 1)      ; Schreibt 4. empfangenes Byte in Buffer4
    Byte4.q=PeekB(Buffer4)& $FF                       ; Schreibt Inhalt von Buffer4 in (quad)Variabel Byte4
    
    sek.q=(Byte4+(Byte3)+(Byte2)+(Byte1)) +7200       ; Ergibt die vergangen Sekunden seit 1. Jan 1900
  Else 
    MessageRequester("Fehler", "Zeit-Server nicht erreichbar !!")
    End
  EndIf 
  
  CloseNetworkConnection(ConnectionID)
  ProcedureReturn sek                                 ;gibt die Sek. zurück an Hauptprogram
EndProcedure


INetEin()
VergangendeSek.q = AtomFaktor()
VergangendeTage.q = VergangendeSek/86400
SekundenAktTag.q=VergangendeSek-VergangendeTage*86400
stunde.f = SekundenAktTag/3600
minute.f = (stunde-Round(stunde,0))*60
sekunde.f = (minute-Round(minute,0))*60


Debug "UHRZEIT = "+Str(Round(stunde,0))+":"+Str(Round(minute,0))+":"+Str(Round(sekunde,0))


Verfasst: 15.07.2007 17:26
von RSBasic
UHRZEIT = 2:0:0 :?

Verfasst: 15.07.2007 17:28
von DarkDragon
RSBasic hat geschrieben:UHRZEIT = 2:0:0 :?
UHRZEIT = 17:27:57
:wink:

Bei mir gehts !!!

Verfasst: 15.07.2007 17:30
von PsionMan
UHRZEIT = 17:28:8

Woran kann das liegen :(

Bei mir geht es Prima, hat noch jemand dieses Problem ?

Verfasst: 15.07.2007 18:15
von MVXA
Buffer1 = AllocateMemory(1)
Buffer2 = AllocateMemory(1) ; Reserviert 4 x 1 Byte zum empfangen der Daten!
Buffer3 = AllocateMemory(1)
Buffer4 = AllocateMemory(1)
:bounce: Held :allright: :lol:
Zu lustig :mrgreen:

Bitte um Erklärung

Verfasst: 15.07.2007 18:21
von PsionMan
@ MVXA
Danke für diesen "hilfreichen" & "motivierenden" Komentar !!!!
Was ist denn daran so komisch ?


bin ja lernfähig - was ist daran Falsch ?




MfG euer RALF

Verfasst: 15.07.2007 18:50
von Kaeru Gaman
nunja... falsch nicht unbedingt... aber es ist eine feuersteinklinge..

du willst 4 byte empfangen, die die 4wertbytes eines Long bilden.

...also richte doch einfach eine variable ein,
übergebe die adresse der variable als buffer
und lese die 4 byte auf einmal ausm netz,
dann ersparst du dir auch das bit-geshifte.

außerdem:
die ausgabestrings solltest du formatieren indem du führende nullen einbaust, das ist bei zeitangaben so üblich.
sieh dir dazu RSet an, bzw. mit herkömmlichen stringoperationen geht es auch.

ansonsten: welcome on board

Danke für den Tip

Verfasst: 15.07.2007 18:59
von PsionMan
@ Kaeru Gaman

das mit AllocateMemory(4) habe ich probiert, aber das gab dann ein Problem mit dem Vorzeichen-Bit der einzelnen Bvts (Siehe unsigned/signed Var in der Hilfe)

Fordere hiermit gerne alle auf mir zu zeigen wie es Richtig geht :oops:

zu dem auffüllen mit Nullen - Ist mir bekannt - aber das Programm sollte in erster Linie nur zeigen wie man auf einen Zeitserver zugreift! :wink:

MfG euer Ralf

Verfasst: 15.07.2007 19:12
von Kaeru Gaman
also.. ohne es groß anzutesten
(habe seit gestern nen neuen rechner und noch kein PB drauf...)

ich würde den buffer so einrichten:

Code: Alles auswählen

Define Buffer.l 
und ausm netz saugen würd ich dann so:

Code: Alles auswählen

ReceiveNetworkData(ConnectionID, @Buffer, 4)
dann sollten die vier byte so wie sie gehören an der richtigen stelle stehen.
wenn du dann einen vorzeichenfehler in der long-variable hast,
kannst du sie mittels

Code: Alles auswählen

sek.q = Buffer & $FFFFFFFF
in eine quad schieben...

außerdem.. wenn das im netz kein vorzeichen hat...
ist es denn wirklich eine unsigned long, die dort zur verfügung gestellt wird?

ach und btw:
die "+7200" hättest du noch erklären können.
wieso ist der server in GMT...?
hat Braunschweig keinen download-port...?

Verfasst: 15.07.2007 19:26
von ts-soft
Hier mal eine etwas überarbeitete Version, die Prinzipiell aber noch gleich ist :wink:
1. Variablen deklariert und reduziert
2. Ein MemoryBuffer
3. Pointer statt Peek (ist schneller und bietet sich an)
4. Formatierte Ausgabe
5. Fehler eingebaut? :mrgreen:

Code: Alles auswählen

EnableExplicit

Procedure INetEin()               ; Stellt Internetverbindung für OpenNetworkConnection her !
  If InitNetwork() = 0
    MessageRequester("Fehler", "Internetverbindung fehlgeschlagen !!!")
    End
  EndIf
EndProcedure

Procedure.d AtomFaktor()          ; Holt die vergangenen Sekunden seit 1.1.1900 von eimen Zeitserver

  Protected *Mem = AllocateMemory(4)
  Protected *Buffer.Byte = *Mem
  Protected ConnectionID.l = OpenNetworkConnection("131.188.34.45", 37, #PB_Network_TCP)  ; öffnet Verbindung zum Zeit-Server
  Protected Byte.q, Sek.q
  
  If ConnectionID And *Mem

    ReceiveNetworkData(ConnectionID, *Buffer, 1)      ; Schreibt 1. empfangenes Byte in Buffer1
    Byte = *Buffer\b &$FF
    sek = Byte << 24                                  ; Multipliziert Byte1 mit 255*255*255

    *Buffer + SizeOf(Byte)
    ReceiveNetworkData(ConnectionID, *Buffer, 1)      ; Schreibt 2. empfangenes Byte in Buffer2
    Byte = *Buffer\b & $FF
    sek + (Byte << 16)                                ; Multipliziert Byte2 mit 255*255

    *Buffer + SizeOf(Byte)
    ReceiveNetworkData(ConnectionID, *Buffer, 1)      ; Schreibt 3. empfangenes Byte in Buffer3
    Byte = *Buffer\b &$FF                             ; Schreibt Inhalt von Buffer3 in (quad)Variabel Byte3
    sek + (Byte << 8)                                 ; Multipliziert Byte2 mit 255

    *Buffer + SizeOf(Byte)
    ReceiveNetworkData(ConnectionID, *Buffer, 1)      ; Schreibt 4. empfangenes Byte in Buffer4
    Byte = *Buffer\b &$FF 
    
    sek + Byte + 7200                                 ; Ergibt die vergangen Sekunden seit 1. Jan 1900

  Else

    MessageRequester("Fehler", "Zeit-Server nicht erreichbar !!")
    End

  EndIf

  CloseNetworkConnection(ConnectionID)
  FreeMemory(*Mem)
  ProcedureReturn sek                                 ;gibt die Sek. zurück an Hauptprogram
EndProcedure


INetEin()
Define VergangendeSek.q = AtomFaktor()
Define VergangendeTage.q = VergangendeSek / 86400
Define SekundenAktTag.q = VergangendeSek - VergangendeTage * 86400
Define stunde.f = SekundenAktTag / 3600
Define minute.f = (stunde - Round(stunde, 0)) * 60
Define sekunde.f = (minute - Round(minute, 0)) * 60

Debug "UHRZEIT = " + RSet(Str(Round(stunde,0)), 2, "0") + ":" + RSet(Str(Round(minute, 0)), 2, "0") + ":" + RSet(Str(Round(sekunde, 0)), 2, "0")
Habs jetzt aber nicht dokumentiert :oops:

Gruß
Thomas