Time Server

Andre Garzia andre at andregarzia.com
Tue Jul 29 00:16:55 EDT 2008


Mark,

I've implemented a couple servers for tiny protocols and have looked a
little into SNTP some years ago. Are you aware of the latency issue
right and the math you need to do to compute the delay between the
server answering stuff and you actually receiving it. I've looked into
the RFC and some other docs and decided against implementing SNTP
readers, the math was kinda confusing.

As for the line:

read from socket theServer with message "rcvTime"

you might want to change that to some other command with some
termination clause, I can't recall the protocol of SNTP but use
something like read ... until or read for ## bytes and use a buffered
read operation. I've found that plain read calls can block till
eternity and should be avoided.

Andre

On Sun, Jul 27, 2008 at 5:00 PM, Mark Schonewille
<m.schonewille at economy-x-talk.com> wrote:
> Thanks for the good advice, Gordon.
>
> Although I would like to be able to talk to SNTP server directly, it is
> sufficient for now. Here is the script. I'll probably put a little libary
> on-line on the Economy-x-Talk website later. Mind line wraps.
>
> -- !!! start here !!!
> /* simple NTP client over Telnet
> Copyright(c)2008 by Economy-x-Talk
> and Mark Schonewille, Nijmegen
> the Netherlands
>
> Copy this button (script) to your own project or attach
> this stack as a substack. Inser the script of this
> button into back - use it as a backscript.
>
> Call the getTime handler as follows:
>
> getTime <callbackMessage>[,server[,port]
>
> - callbackMessage is the name of the handler that will trap
> the callback message
> - the optional server parameter is the address of a time server
> - the port parameter is optional as well and contains the port
> number at which the server is contacted; the port number is only
> necessary if not included with the server address.
>
> Examples:
>
> getTime "timeReceived"
> getTime "timeReceived","time.nist.gov:13"
> getTime "timeReceived","time.nist.gov",13
>
> Above examples need a handler names "timeReceived". The
> callback message comes with one parameter. This parameter is
> an array with 9 keys.
>
> d-st: a code indicating daylight saving or standart time
> julian date: (modified) Julian date
> error: any error messages
> compensated delay: time adjustment, which makes sure that the time is right
> on arrival
> leap: whether a 1 second time adjustment was applied
> raw: the original time stamp use to compose the array
> server health: whether the server is running without problems
> date: date in American format
> time: long time
>
> See http://tf.nist.gov/service/its.htm for more information.
>
> The object, card or stack that calls the getTime handler
> must have a handler to trap the callback message.
>
> Credits:
> Thanks to Gordon Tillman for the hint to use Telnet and to
> whoever made the Telnet.mc stack for MetaCard.
> */
>
>
> constant kTimeServer = "time.nist.gov:13"
>
> local lCallbackMessage, lButtonID
>
> on getTime theCallbackMessage,theServer,thePort
>   if theServer is empty then put kTimeServer into theServer
>   if thePort is not empty then put colon & thePort after theServer
>   put theCallbackMessage into lCallbackMessage
>   put the long id of the target into lButtonID
>   open socket to theServer
>   if the result is not empty then return false
>   read from socket theServer with message "rcvTime"
>   if the result is not empty then return false
>   else return true
> end getTime
>
> on rcvTime theSock,theTime
>   put the long id of the target
>   filter theTime without empty
>   put theTime into myTimeArray["raw"]
>   put word 1 of theTime into myTimeArray["julian date"] -- modified julian
> date
>   put word 2 of theTime into myTimeArray["date"]
>   put word 3 of theTime into myTimeArray["time"]
>   put word 4 of theTime into myTimeArray["d-st"] --tt
>   put word 5 of theTime into myTimeArray["leap"]
>   put word 6 of theTime into myTimeArray["server health"]
>   put word 7 of theTime into myTimeArray["compensated delay"] -- msADV
>   if not ((word 6 of theTime) is 0 and last char of theTime is "*") then
>      put "Error: server may return invalid time" into myTimeArray["error"]
>   else
>      put empty into myTimeArray["error"]
>   end if
>   do "send" && quote & lCallbackMessage && "myTimeArray" & quote && "to
> lButtonID"
>   close socket theSock -- normally unnecessary
> end rcvTime
>
> -- the following handler is useful
> -- of you have your script in a checkbox
> on mouseUp
>   if the id of the target is the id of me then
>      if the long id of me is in the backscripts then
>         remove the script of me from back
>         set the hilite of me to false
>      else
>         insert the script of me into back
>         set the hilite of me to true
>      end if
>   end if
> end mouseUp
>
> on socketError theSock,theErr
>   put "error:" && theErr into myTimeArray["error"]
>   do "send" && quote & lCallbackMessage && "myTimeArray" & quote && "to
> lButtonID"
> end socketError
>
> on socketTimeout theSock
>   put "error:" && "socket timeout" into myTimeError["error"]
>   do "send" && quote & lCallbackMessage && "myTimeArray" & quote && "to
> lButtonID"
> end socketTimeout
> -- !!! finish !!! ------------
>
>
> --
> Best regards,
>
> Mark Schonewille
>
> Economy-x-Talk Consulting and Software Engineering
> http://economy-x-talk.com
> http://www.salery.biz
>
> Benefit from our inexpensive hosting services. See
> http://economy-x-talk.com/server.html for more info.
>
> On 27 jul 2008, at 16:51, Gordon Tillman wrote:
>
>> Mark I know you can talk to an SNTP server with telnet.  Here I just did
>> the following:
>>
>>
>> $ telnet time-a.nist.gov 13
>> Trying 129.6.15.28...
>> Connected to time-a.nist.gov.
>> Escape character is '^]'.
>>
>> 54674 08-07-27 14:50:55 50 0 0 340.9 UTC(NIST) *
>> Connection closed by foreign host.
>>
>> --gordon
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>



-- 
http://www.andregarzia.com All We Do Is Code.



More information about the use-livecode mailing list