Seite 1 von 1

ntp-zeitabfrage?

Verfasst: Samstag 30. August 2008, 14:14
von roschi
hallo!

ich glaube, dass ich mal wieder eure hilfe in anspruch nehmen muesste. :)

ich wollte mir ein kleines programm schreiben, das mir meine systemzeit mit einem zeitserver abgleicht. das wird ja ueber ntp gemacht. wie kann ich nun in python das ntp-protokoll nutzen?

so ging es jedenfalls leider nicht:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(("ptbtime1.ptb.de", 123))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: (10061, 'Connection refused')
hat da eventuell jemand eine idee?
ich freue mich ueber jede hilfe, die ich kriegen kann!

mfg
roschi

Verfasst: Samstag 30. August 2008, 15:40
von DasIch

Code: Alles auswählen

socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

Verfasst: Samstag 30. August 2008, 16:05
von roschi
hallo!

ach, UDP... natuerlich! *PATSCH*, vielen dank!
gut, und was muss ich nun zum server senden, um die aktuelle zeit zu bekommen?

ich weiss, dass das jetzt nicht mehr wirklich mit python zu tun hat, aber ich frage trotzdem mal.

mfg
roschi

Verfasst: Samstag 30. August 2008, 17:12
von DasIch
roschi hat geschrieben:gut, und was muss ich nun zum server senden, um die aktuelle zeit zu bekommen?
Wie wärs wenn du dir mal den RFC 958 anschaust?

Verfasst: Samstag 30. August 2008, 17:40
von lunar
http://de.wikipedia.org/wiki/Network_Time_Protocol

Da sind die entsprechenden RFCs verlinkt.

Wenn du aber lediglich auf einfache Weise eine hochgenaue Uhr abfragen möchtest, und nicht an NTP gebunden bist, dann wäre wohl "mx.DateTime.NIST" was für dich. Das fragt die Atomuhren des NIST ab. Die kannst du sogar einfach ohne externes Modul abfragen, da das Protokoll absolut simpel ist. Such mal bei Google danach ;)

Verfasst: Samstag 30. August 2008, 18:48
von roschi
hallo!

ja, das ist gut.
ich hab mir den RFC schon angeschaut. allerdings fand ich in ihm nicht die richtige syntax zum abfragen der zeit. ich weiss nicht, ob ich es ueberlesenhabe, oder einfach meine nicht so guten englischkenntnisse der grund sind. das format, in dem die zeit dann zurueckgegeben wird, habe ich zwar verstanden, weiss aber immer noch nicht, was ich nun senden soll.

ich wuerde mich echt freuen, wenn mir da jemand helfen kann.

mfg
roschi

Verfasst: Samstag 30. August 2008, 19:36
von DasIch

Verfasst: Samstag 30. August 2008, 19:37
von kaschu
roschi hat geschrieben:ich wuerde mich echt freuen, wenn mir da jemand helfen kann.
schon mal bei activestate vorbeigeschaut? http://code.activestate.com/recipes/117211/

Verfasst: Samstag 30. August 2008, 19:51
von HWK
Ich habe das mal im Web gefunden. Ich weiß leider nicht mehr wo.

Code: Alles auswählen

from urllib import urlopen
from time import time
from os import system

def ask_time( url, tzn, tz2=None ):
  """Get time from the Internet.
  # url must be e.g. http://tycho.usno.navy.mil/cgi-bin/timer.pl :-)
  # tzn must be UTC,EST,PST,etc.
  #     UTC will return time like "22:30:40 UT"
  #     Other options return like "05:30:40 PM" i.e. with AM/PM
  # tz2 can be another time zone, e.g. EDT,PDT,etc.
  #Returns "HH:MM:SS AA" or empty string if any failure.
  """
  try:
    doc = urlopen( url ).readlines()
    #<TITLE>What time is it?</TITLE>
    #<H2> US Naval Observatory Master Clock Time</H2> <H3>
    #<BR>Apr. 30, 20:01:28 UTC
    #<BR>Apr. 30, 04:01:28 PM EDT
    #....
    for line in doc:
      line = line.strip()
      if line.endswith( tzn ) or (tz2 and line.endswith( tz2 )):
        col = line.index(':')
        return line[col-2:col+9] # 04:01:28 PM (or 22:30:40 UT)
  except:
    pass
  return ''

def synch_time( url, tz, tz2=None ):
  time_str = ask_time( url, tz, tz2 )
  if time_str:
    try:
      before = time()
      system( 'time ' + time_str ) # do synchronize!
      delta = time() - before
      return "Time is %s\nCorrected by %.1f sec" % (time_str,delta)
    except:
      pass
  return 'Not synchronized'

if __name__ == "__main__":
  from win32ui import MessageBox
  rc = synch_time( "http://tycho.usno.navy.mil/cgi-bin/timer.pl", "EST", "EDT" )
  MessageBox( rc, "synch_time" )

# EOF
MfG
HWK

Verfasst: Samstag 30. August 2008, 21:07
von roschi
super!

vielen dank!
es funktioniert jetzt einwandfrei.

ich habe nun folgendes gebastelt:
http://paste.pocoo.org/show/83933/

ihr wart mir mal wieder - wie schon so oft - eine grosse hilfe.
und nochmal: vielen dank !

mfg
roschi