SNTP - Simple Network Time Protocol - BUG fix Update
Beau Schwabe
Posts: 6,566
I think I might have found and fixed the elusive bug in the time calculation that would always rear it's head around this time of year.
The DEMO program has not changed, but what you will want to update is the SNTP Simple Network Time Protocol v2.01.zip file.
I also updated the Perl script that I originally wrote to test the SNTP server before I migrated it to the Spinneret..
Please continue to let me know if there are any issues with this code. Thanks!
Perl Script: TimeTest.pl
Example Perl output:
The DEMO program has not changed, but what you will want to update is the SNTP Simple Network Time Protocol v2.01.zip file.
I also updated the Perl script that I originally wrote to test the SNTP server before I migrated it to the Spinneret..
Please continue to let me know if there are any issues with this code. Thanks!
Perl Script: TimeTest.pl
#!/usr/bin/perl use IO::Socket::INET; $MySocket=new IO::Socket::INET->new(PeerPort=>123, #open socket Proto=>'udp', PeerAddr=>'132.163.4.101'); $data = chr(227) . chr(0) . chr(0) . chr(148); #LI/VN/Mode, Stratum, Poll, Precision $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Root Delay $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Root Dispersion $data = $data . "LOCL"; #Reference Identifier $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Reference Timestamp $data = $data . chr(0) . chr(0) . chr(0) . chr(0); $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Originate Timestamp $data = $data . chr(0) . chr(0) . chr(0) . chr(0); $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Receive Timestamp $data = $data . chr(0) . chr(0) . chr(0) . chr(0); $data = $data . chr(0) . chr(0) . chr(0) . chr(0); #Transmit Timestamp $data = $data . chr(0) . chr(0) . chr(0) . chr(0); $MySocket->send($data); #Waiting to receive data $MySocket->recv($data,56); $MySocket->close(); #received data close socket @Chars = split("", $data); $n1 = ord($Chars[40]); #Upper 32 bits of Transmit Timestamp $n2 = ord($Chars[41]); $n3 = ord($Chars[42]); $n4 = ord($Chars[43]); $Seconds = $n4 + $n3*256 + $n2*65536 + $n1*16777216; #Seconds since Jan1, 1900 $Zone = -6; #GMT - 6 time zone adjust #$Zone = -5; #use GMT - 5 during daylight savings $Seconds = $Seconds + 3600*$Zone; print "Seconds since Jan1, 1900 : $Seconds \n\r"; $Days = int((($Seconds >> 7)/675)+1); #Days since Jan1, 1900 {divide seconds by 86,400 and add 1} print " Days since Jan1, 1900 : $Days \n\r"; $Years = int($Days / 365); #Years since 1900 print " Years since Jan1, 1900 : $Years \n\r"; $Days = $Days % 365; #Days this year $LeapYears = int($Years / 4); #Leap Years since 1900 $CurrentYear = $Years + 1900 ; #Current Year $Days = $Days - $LeapYears; #Leap Year Days Correction print " Days so far this year : $Days \n\r\n\r"; #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $count = 1; #Routine to determine do { # - The Current Month $Month = 30; # - The Current Date $c1 = ($count & 1); # $c2 = (($count & 8) >>3); # from the number of Days if ($c1 != $c2) { # passed in the current year $Month = $Month +1; } if ($count == 2) { $Month = 28; } print "In month $count of this year, there are $Month days. \n\r"; if ($Days <= $Month) { $CurrentMonth = $count; $CurrentDate = $Days; $count = 12; } if ($Days > $Month) { $Days = $Days - $Month; } $count++; } until ($count == 13); #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Seconds = $Seconds - ((($Years * 365)*675) *128); #Seconds this year $SS = $Seconds; $MM = int($SS / 60); $SS = $SS - ($MM*60); #Current Seconds $HH = int($MM / 60); $MM = $MM - ($HH*60); #Current Minutes $DD = int($HH / 24); $HH = $HH - ($DD*24); #Current Hour print "\n\r"; print "Current Date: $CurrentMonth/$CurrentDate/$CurrentYear\n\r"; print "Current Time: $HH:$MM:$SS\n\r";
Example Perl output:
Seconds since Jan1, 1900 : 3568755733 Days since Jan1, 1900 : 41306 Years since Jan1, 1900 : 113 Days so far this year : 33 In month 1 of this year, there are 31 days. In month 2 of this year, there are 28 days. Current Date: 2/2/2013 Current Time: 1:2:13
Comments
Updated file in post #1