c# Internet时间服务器同步

2009-02-02 17:48 8226人阅读 评论(2) 收藏 举报

服务器internetc#socketstringwindows

需要用到的名空间

[c-sharp] view plaincopy

  1. using System.Net;
  2. using System.Net.Sockets;
  3. using System.Runtime.InteropServices;

建立一个结构

[c-sharp] view plaincopy

  1. public struct SystemTime
  2. {
  3. public ushort wYear;
  4. public ushort wMonth;
  5. public ushort wDayOfWeek;
  6. public ushort wDay;
  7. public ushort wHour;
  8. public ushort wMinute;
  9. public ushort wSecond;
  10. public ushort wMilliseconds;
  11. /// <summary>
  12. /// 从System.DateTime转换。
  13. /// </summary>
  14. /// <param name="time">System.DateTime类型的时间。</param>
  15. public void FromDateTime(DateTime time)
  16. {
  17. wYear = (ushort)time.Year;
  18. wMonth = (ushort)time.Month;
  19. wDayOfWeek = (ushort)time.DayOfWeek;
  20. wDay = (ushort)time.Day;
  21. wHour = (ushort)time.Hour;
  22. wMinute = (ushort)time.Minute;
  23. wSecond = (ushort)time.Second;
  24. wMilliseconds = (ushort)time.Millisecond;
  25. }
  26. /// <summary>
  27. /// 转换为System.DateTime类型。
  28. /// </summary>
  29. /// <returns></returns>
  30. public DateTime ToDateTime()
  31. {
  32. return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
  33. }
  34. /// <summary>
  35. /// 静态方法。转换为System.DateTime类型。
  36. /// </summary>
  37. /// <param name="time">SYSTEMTIME类型的时间。</param>
  38. /// <returns></returns>
  39. public static DateTime ToDateTime(SystemTime time)
  40. {
  41. return time.ToDateTime();
  42. }
  43. }

要用到Windows的API函数来设置系统时间

[c-sharp] view plaincopy

  1. public class Win32API
  2. {
  3. [DllImport("Kernel32.dll")]
  4. public static extern bool SetLocalTime(ref SystemTime Time);
  5. [DllImport("Kernel32.dll")]
  6. public static extern void GetLocalTime(ref SystemTime Time);
  7. }

用Socket获取Internet时间服务器上的时间

[c-sharp] view plaincopy

  1. public void SetInternetTime()
  2. {
  3. // 记录开始的时间
  4. DateTime startDT = DateTime.Now;
  5. //建立IPAddress对象与端口,创建IPEndPoint节点:
  6. int port = 13;
  7. string[] whost = { "5time.nist.gov", "time-nw.nist.gov", "time-a.nist.gov", "time-b.nist.gov", "tick.mit.edu", "time.windows.com", "clock.sgi.com" };
  8. IPHostEntry iphostinfo;
  9. IPAddress ip;
  10. IPEndPoint ipe;
  11. Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
  12. c.ReceiveTimeout = 10 * 1000;//设置超时时间
  13. string sEX = "";// 接受错误信息
  14. // 遍历时间服务器列表
  15. foreach (string strHost in whost)
  16. {
  17. try
  18. {
  19. iphostinfo = Dns.GetHostEntry(strHost);
  20. ip = iphostinfo.AddressList[0];
  21. ipe = new IPEndPoint(ip, port);
  22. c.Connect(ipe);//连接到服务器
  23. if (c.Connected) break;// 如果连接到服务器就跳出
  24. }
  25. catch (Exception ex)
  26. {
  27. sEX = ex.Message;
  28. }
  29. }
  30. if (!c.Connected)
  31. {
  32. MessageBox.Show("时间服务器连接失败!/r错误信息:" + sEX, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  33. return;
  34. }
  35. //SOCKET同步接受数据
  36. byte[] RecvBuffer = new byte[1024];
  37. int nBytes, nTotalBytes = 0;
  38. StringBuilder sb = new StringBuilder();
  39. System.Text.Encoding myE = Encoding.UTF8;
  40. while ((nBytes = c.Receive(RecvBuffer, 0, 1024, SocketFlags.None)) > 0)
  41. {
  42. nTotalBytes += nBytes;
  43. sb.Append(myE.GetString(RecvBuffer, 0, nBytes));
  44. }
  45. //关闭连接
  46. c.Close();
  47. string[] o = sb.ToString().Split(‘ ‘); // 打断字符串
  48. textBox1.Text = sb.ToString();
  49. TimeSpan k = new TimeSpan();
  50. k = (TimeSpan)(DateTime.Now - startDT);// 得到开始到现在所消耗的时间
  51. DateTime SetDT = Convert.ToDateTime(o[1] + " " + o[2]).Subtract(-k);// 减去中途消耗的时间
  52. //处置北京时间 +8时
  53. SetDT = SetDT.AddHours(8);
  54. //转换System.DateTime到SystemTime
  55. SystemTime st = new SystemTime();
  56. st.FromDateTime(SetDT);
  57. //调用Win32 API设置系统时间
  58. Win32API.SetLocalTime(ref st);
  59. MessageBox.Show("时间已同步", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  60. }

这个东西是收集网上的一些做法再修改了一下

用vs2008+windows xp sp2测试通过

但是始终会有±1秒的误差,但大部分误差在1秒以下,尚可接受

使用的名空间包括vs自己添加的,windows Form中用到的那部分

如果换了环境,可作相应修改

转载:http://blog.csdn.net/zhengxia19/article/details/3858910

时间: 2024-12-24 22:49:28

c# Internet时间服务器同步的相关文章

VC自动与Internet时间服务器同步更新

在VCKBASE.CSDN里挖了许久的坟,才找到一些有点用的资料,最后自己整理出这样的个函数,方面VC实现时间同步,多的不说,自己看源码,根据自己的需要可以适当修改源码: [cpp] view plain copy print? #include <WinSock.h> #pragma comment (lib,"Ws2_32") struct   NTP_Packet { int      Control_Word; int      root_delay; int   

小凡的Linux主机与时间服务器同步记录

小凡的Linux主机与时间服务器同步记录 导读 我们新安装的Linux主机,如果没有做与互联网服务器时间同步的处理的话,当我们使用date命令的时候,我们就看不到当前的时间,只能看到过去的时间.在我们接下来的Linux学习过程中,经常需要利用到实时时间,所以与互联网时间同步,是我们安装Linux系统后迫切需要解决的问题.今天,小凡就手把手交你,如何通过定时任务,将你的Linux主机时间和互联网时间服务器同步! 1.了解定时任务工具crontab a.相关命令的介绍 crontab -u # 设定

设置linux服务器定时与时间服务器同步

在一些大公司经常出现这样一个情况:公司或一些机关单位的内部业务系统的应用服务器以及数据都是做的多机集群部署而且基本都是linux系统,而且都是内部网,不与外网通讯的.这样经常就会出现一个情况,我发送任务的时间还晚于对方任务接收的时间.这样经常令我们头痛,那为什么会出现这样一个情况呢,其实就是linux机器的系统没有定时同步导致的,这个问题不仅linux系统有,windows系统也会出现这样的问题,比如我们的windows系统很久没开过机了,那么我们就会发现windows系统上的时间不对了,但是为

chronyd时间服务器同步时间配置

chrony是两个用来维持计算机系统时钟准确性的程序,这两个程序命名为chronyd和chronyc. chronyd是一个在系统后台运行的守护进程.他根据网络上其他时间服务器时间来测量本机时间的偏移量从而调整系统时钟.对于孤立系统,用户可以手动周期性的输入正确时间(通过chronyc).在这两种情况下,chronyd决定计算机快慢的比例,并加以纠正.chronyd实现了NTP协议并且可以作为服务器或客户端. chronyc是用来监控chronyd性能和配置其参数的用户界面.他可以控制本机及其他

AD域中客户端时间与服务器时间不同步的解决办法

公司考勤用的是国内一家OA软件里的考勤模块,个人在电脑上在规定时间内登记的形式,客户端都是采取域用户登录的形式,电脑客户端的时间显示比OA登记的时间晚两分钟,[注:OA服务器上安装有时间校正软件iTimeSync,确保OA服务器时间一直保持与标准时间一致],其次每次电脑客户端慢两分钟,大家就晚两分钟下班,久而久之大家发现电脑时间老是与手机的时间慢两分钟就不高兴了, 信息反馈到了信息中心,要求信息中心把大家的时间调整一致,因为域用户无法修改时间,即使你修改后重启电脑后时间又与AD同步了. 域中的计

域控制器同步internet时间

确保w32tm服务启动 net start w32time net stop w32time (停止) 通过微软公司的时间服务器(位于time.windows.com)检查5个时间样本,验证时间服务器的正确程度. a+表示超前,a-表示落后 w32tm /stripchart /computer:time.windows.com /samples:5 /dataonly 与internet时间同步 w32tm /config "/manualpeerlist:time.nist.gov time

开源软件包的安装及ntp时间服务器简析

linux 系统服务篇(-)一.NTP时间服务器 network time protocol    NTP服务器的使命:使局域网内服务器(或个人pc端)的时间保持一致.二.开源软件的使用步骤:    1.安装软件服务.        (1)源码方式安装            下载,解压源码(wegt 或 rz (我用CRT)tar xf)            分析安装平台  ./configure(一般是测试软件的安装环境,看缺少哪些必要的依赖安装包)            编译软件     

centos6.5下如何搭建ntp时间服务器

NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,时间不统一影响业务,如果一台一台的修改,那不得累死人啊.这时搭建一个自己的NTP服务器就显出它的优势了. CentOS 6.5下配置好相关的yum源.确保你的ntp服务器可以连网 1.yum安装ntp服务 [[email protected] ~] yum install -y ntp 2.编译ntp的配置文件/etc/ntp

Centos6系列搭建NTP时间服务器

NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms. NTP官方站点:http://www.ntp.org/ ,NTP服务基于C/S(Client/Server)架构,每台机器既可以是NTPserver,也可以为NTPclient. 在linux中有两种查看系统时间的方法: date        #查看系