正在阅读:浅谈网络时间校正原理及实践运用浅谈网络时间校正原理及实践运用

2005-04-15 09:54 出处: 作者:王晓光 责任编辑:xietaoming

  主代码:

public class frmMain : System.Windows.Forms.Form
{
////省略自动生成的代码
////……………

 Thread thrTimeSync;
 private void TimeSyncProc()
 {
  while(true)
  {
   TcpClient c = new TcpClient();
   c.Connect("www.time.ac.cn", 37);   //连接到国内授时服务器

   NetworkStream s;
   s = c.GetStream();          //读取数据流
   c.Close();

   byte []buf = new byte[4];
   s.Read(buf,0,4);                   //把数据存到数组中

   uint lTime;

   //把服务器返回数据转换成1900/1/1 UTC 到现在所经过的秒数
   lTime = ((uint)buf[0] << 24) + ((uint)buf[1] << 16) +                  ((uint)buf[2] << 8) + (uint)buf[3];

   //得到真实的本地时间
   System.DateTime datetime = new DateTime(1900,1,1,0,0,0,0);
   datetime = datetime.AddSeconds(lTime).ToLocalTime();

   //这里可以显示出时间。有兴趣的朋友可以取消注释看一下效果。
   //MessageBox.Show(datetime.ToLongDateString() + datetime.ToLongTimeString());

   //修改系统时间
   SystemTime sysDateTime = new SystemTime();

   sysDateTime.wYear = (short)datetime.Year;
   sysDateTime.wDay = (short)datetime.Day;
   sysDateTime.wMonth = (short)datetime.Month;

   sysDateTime.wHour = (short)datetime.Hour;
   sysDateTime.wMinute = (short)datetime.Minute;
   sysDateTime.wSecond = (short)datetime.Second;

   Win32API.SetLocalTime(ref sysDateTime);

   System.Threading.Thread.Sleep(1 * 1000);
  }
 }

 private void frmMain_Load(object sender, System.EventArgs e)
 {
  thrTimeSync = new Thread(new ThreadStart(TimeSyncProc));
  thrTimeSync.Start();
 }

 private void frmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {
  thrTimeSync.Abort();
 }

}

  到此为止,本文的内容基本讲完了。但有的朋友或许会问,这种方法的精确度如何保证?网络速度难道不会造成误差吗?没错,这正是本文所讲方法的局限性。使用这种方法,由于网络延迟带来的误差是难以消除的,因此只能用在要求不高的场所。在对精度要求很高的情况中,可以使用Simple Network Time协议(RFC1769, http://rfc.linuxforum.net/rfc1769.txt)来精确授时。其大体原理是数据包在经过服务器时都记录时间损失,最终通过调整来达到最小误差。

  源程序可以在 这里 下载。

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品