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

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.
PsionMan
Beiträge: 8
Registriert: 15.07.2007 15:42

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

Beitrag 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))

Zuletzt geändert von PsionMan am 15.07.2007 20:20, insgesamt 1-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

UHRZEIT = 2:0:0 :?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

RSBasic hat geschrieben:UHRZEIT = 2:0:0 :?
UHRZEIT = 17:27:57
:wink:
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.
PsionMan
Beiträge: 8
Registriert: 15.07.2007 15:42

Bei mir gehts !!!

Beitrag von PsionMan »

UHRZEIT = 17:28:8

Woran kann das liegen :(

Bei mir geht es Prima, hat noch jemand dieses Problem ?
Zuletzt geändert von PsionMan am 15.07.2007 18:25, insgesamt 1-mal geändert.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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:
Bild
PsionMan
Beiträge: 8
Registriert: 15.07.2007 15:42

Bitte um Erklärung

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PsionMan
Beiträge: 8
Registriert: 15.07.2007 15:42

Danke für den Tip

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten