c# Internet时间服务器同步
需要用到的名空间
- using System.Net;
- using System.Net.Sockets;
- using System.Runtime.InteropServices;
建立一个结构
- public struct SystemTime
- {
- public ushort wYear;
- public ushort wMonth;
- public ushort wDayOfWeek;
- public ushort wDay;
- public ushort wHour;
- public ushort wMinute;
- public ushort wSecond;
- public ushort wMilliseconds;
- /// <summary>
- /// 从System.DateTime转换。
- /// </summary>
- /// <param name="time">System.DateTime类型的时间。</param>
- public void FromDateTime(DateTime time)
- {
- wYear = (ushort)time.Year;
- wMonth = (ushort)time.Month;
- wDayOfWeek = (ushort)time.DayOfWeek;
- wDay = (ushort)time.Day;
- wHour = (ushort)time.Hour;
- wMinute = (ushort)time.Minute;
- wSecond = (ushort)time.Second;
- wMilliseconds = (ushort)time.Millisecond;
- }
- /// <summary>
- /// 转换为System.DateTime类型。
- /// </summary>
- /// <returns></returns>
- public DateTime ToDateTime()
- {
- return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
- }
- /// <summary>
- /// 静态方法。转换为System.DateTime类型。
- /// </summary>
- /// <param name="time">SYSTEMTIME类型的时间。</param>
- /// <returns></returns>
- public static DateTime ToDateTime(SystemTime time)
- {
- return time.ToDateTime();
- }
- }
要用到Windows的API函数来设置系统时间
- public class Win32API
- {
- [DllImport("Kernel32.dll")]
- public static extern bool SetLocalTime(ref SystemTime Time);
- [DllImport("Kernel32.dll")]
- public static extern void GetLocalTime(ref SystemTime Time);
- }
用Socket获取Internet时间服务器上的时间
- public void SetInternetTime()
- {
- // 记录开始的时间
- DateTime startDT = DateTime.Now;
- //建立IPAddress对象与端口,创建IPEndPoint节点:
- int port = 13;
- 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" };
- IPHostEntry iphostinfo;
- IPAddress ip;
- IPEndPoint ipe;
- Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
- c.ReceiveTimeout = 10 * 1000;//设置超时时间
- string sEX = "";// 接受错误信息
- // 遍历时间服务器列表
- foreach (string strHost in whost)
- {
- try
- {
- iphostinfo = Dns.GetHostEntry(strHost);
- ip = iphostinfo.AddressList[0];
- ipe = new IPEndPoint(ip, port);
- c.Connect(ipe);//连接到服务器
- if (c.Connected) break;// 如果连接到服务器就跳出
- }
- catch (Exception ex)
- {
- sEX = ex.Message;
- }
- }
- if (!c.Connected)
- {
- MessageBox.Show("时间服务器连接失败!/r错误信息:" + sEX, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
- //SOCKET同步接受数据
- byte[] RecvBuffer = new byte[1024];
- int nBytes, nTotalBytes = 0;
- StringBuilder sb = new StringBuilder();
- System.Text.Encoding myE = Encoding.UTF8;
- while ((nBytes = c.Receive(RecvBuffer, 0, 1024, SocketFlags.None)) > 0)
- {
- nTotalBytes += nBytes;
- sb.Append(myE.GetString(RecvBuffer, 0, nBytes));
- }
- //关闭连接
- c.Close();
- string[] o = sb.ToString().Split(' '); // 打断字符串
- textBox1.Text = sb.ToString();
- TimeSpan k = new TimeSpan();
- k = (TimeSpan)(DateTime.Now - startDT);// 得到开始到现在所消耗的时间
- DateTime SetDT = Convert.ToDateTime(o[1] + " " + o[2]).Subtract(-k);// 减去中途消耗的时间
- //处置北京时间 +8时
- SetDT = SetDT.AddHours(8);
- //转换System.DateTime到SystemTime
- SystemTime st = new SystemTime();
- st.FromDateTime(SetDT);
- //调用Win32 API设置系统时间
- Win32API.SetLocalTime(ref st);
- MessageBox.Show("时间已同步", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
这个东西是收集网上的一些做法再修改了一下
用vs2008+windows xp sp2测试通过
但是始终会有±1秒的误差,但大部分误差在1秒以下,尚可接受
使用的名空间包括vs自己添加的,windows Form中用到的那部分
如果换了环境,可作相应修改
转载:http://blog.csdn.net/zhengxia19/article/details/3858910
c# Internet时间服务器同步的更多相关文章
- VC自动与Internet时间服务器同步更新
在VCKBASE.CSDN里挖了许久的坟,才找到一些有点用的资料,最后自己整理出这样的个函数,方面VC实现时间同步,多的不说,自己看源码,根据自己的需要可以适当修改源码: #include <W ...
- 小凡的Linux主机与时间服务器同步记录
小凡的Linux主机与时间服务器同步记录 导读 我们新安装的Linux主机,如果没有做与互联网服务器时间同步的处理的话,当我们使用date命令的时候,我们就看不到当前的时间,只能看到过去的时间.在我们 ...
- 设置linux服务器定时与时间服务器同步
在一些大公司经常出现这样一个情况:公司或一些机关单位的内部业务系统的应用服务器以及数据都是做的多机集群部署而且基本都是linux系统,而且都是内部网,不与外网通讯的.这样经常就会出现一个情况,我发送任 ...
- 自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org, 120.24.166.46 端口 123
自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org 海康提供的NTP服务器 120.24.166.46 端口 123
- centos下部署NTP时间服务器同步环境记录
1)服务端部署 安装所需软件包 [root@test ~]# yum -y install ntp ntpdate 服务端自己先手工同步一次时间. [root@test ~]# ntpdate ntp ...
- Linux基础命令---ntpstat显示时间服务器同步
ntpstat ntpstat指令用于显示本机上一次和服务器同步时间的情况. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ntpstat 2 ...
- 分享淘宝时间服务器同步时间接口api和苏宁时间服务器接口api
最近要开发一款抢购秒杀的小工具,需要同步系统时间,这里分享两个时间服务器接口api给大家: 1.淘宝时间服务器时间接口 http://api.m.taobao.com/rest/api3.do?api ...
- chronyd时间服务器同步时间配置
chrony是两个用来维持计算机系统时钟准确性的程序,这两个程序命名为chronyd和chronyc. chronyd是一个在系统后台运行的守护进程.他根据网络上其他时间服务器时间来测量本机时间的偏移 ...
- linux下自动同步internet时间
linux下很简单直接一句即可: ntpdate time.nist.gov ntp后面参数为internet时间服务器url或ip即可. 但是ntpdate命令需要root特权,如果做成自动运行每次 ...
随机推荐
- 【转】c++内存泄露检测,长文慎入!
原文网址:http://blog.csdn.net/zengraoli/article/details/8905334 关于内存泄露的,今天无意想到,网上找了一下 本篇blog附带的所有工具和代码 ...
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
转:http://www.xue5.com/Mobile/iOS/747036.html 之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决 ...
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
- Android-day02_广播
1.什么是广播 貌似一个人大声喊一句话,别人听到了这就是广播 2.在android中广播有标准广播和有序广播 标准广播也就是发送一个广播,所有人都能同一时间接收到 有序广播则是有顺序的广播,发送的时候 ...
- 基本输入输出系统BIOS---显示输出
显示器通过显示适配卡与系统相连, 显示适配卡是显示输出的接口卡,照相的显示器是CGA和EGA,目前的显示适配卡是VGA和TVGA,他们都支持两种显示方式,文本显示和图形显示 在BIOS中提供的显示I/ ...
- 从零开始完整Electron桌面开发(1)搭建开发环境
[OTC] # 需要知识 1. 简单的html.javascript.css知识,就是web前端入门知识. 2. 简单命令行的应用,不会也没关系,照着代码敲就行. 3. 下载安装就不说了吧. 4. 本 ...
- 去除下载电影和电视剧文件名中的多余字符[python实现]
讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),,搞得文件名好长,可以使用下面的Python代码,自行修改即可. #!\usr\bin\env python # -*- coding: u ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
- Google App Engine Deployment 相关问题
1.GAE instance上传成功之后可以正常运行的情况下.在Google账户中“关联的应用和网站”,撤销Google App Engine appcfg对Google账户的访问权限. 再次上传时, ...
- MAC机常用快捷键整理表格
MAC机常用快捷键整理表格 范围 快捷键 说明 图形 (Command 键)在某些 Apple 键盘上,此键也可能为标志() Control (Control 键) Alt Opt ...