GetNetTime.js
/*=====================================================================
Function: GetTime
Purpose: Get time from Internet Time Servers.
Argument: Maximum milliseconds waiting for reply from the servers.
Return: A Time object if successful, null if not.
=====================================================================*/
var udp=Context.SocketsManager.CreateUDPObject();
udp.SetCallbacks(this);
var serverIPs=new Array("200.50.25.62", "64.90.182.55", "206.246.118.250","64.236.96.53","68.216.79.113","99.150.184.201","64.113.32.5","132.163.4.101","132.163.4.103","128.138.140.44","128.138.188.172","131.107.13.100","207.200.81.113","69.25.96.13","64.125.78.85","64.147.116.229");
var recvData=0; //The server will gives us a 32-bit interger, the number of seconds since 1900-01-01 00:00:00.
function GetTime(expireMS)
{
if(!expireMS)
{
expireMS=3000; //default expiring time is 3 seconds
}
recvData=0;
// send 'helo' to servers
var i, n;
n=serverIPs.length;
for(i=0; i<n; i++)
{
var adr=Context.SocketsManager.CreateInternetAddressObject();
adr.SetAddress(serverIPs[i]);
adr.Port=37;
udp.SendTextTo(adr, "helo", true);
}
//if data does not arrive within 'expireMS', we abort
var tk0=Context.TickCount;
while((Context.TickCount-tk0)<expireMS && recvData==0)
{
Context.SocketsManager.DoRoutine();
}
udp.Close();
if(recvData==0) //failed.
{
return(null);
}
var dw=Context.SocketsManager.ntohl(recvData); //bytes order of recvData is network order, must be reverted for Intel
var t=Context.CreateTimeObject();
t.Init(1900, 1, 1, 0, 0, 0); //init the time object with 1900-00-00 0:0:0
t.Add(0, 0, 0, dw); //add the received number of seconds;
return(t.Valid? t : null);
}
/*=====================================================================
OnDataReceived:
Callback function, called by UDP when data arrives
=====================================================================*/
function OnDataReceived(udpobj, adr, buf)
{
if(buf.DataSize==4 && recvData==0)
{
recvData=buf.DWordAt(0);
}
}