博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#获取网络时间并同步本地时间
阅读量:7251 次
发布时间:2019-06-29

本文共 3028 字,大约阅读时间需要 10 分钟。

原文:

通过TCP形式来获取NTP时间。主要代码如下:

[DllImport("kernel32.dll")]        private static extern bool SetLocalTime(ref Systemtime time);        [StructLayout(LayoutKind.Sequential)]        private struct Systemtime        {            public short year;            public short month;            public short dayOfWeek;            public short day;            public short hour;            public short minute;            public short second;            public short milliseconds;        }        ///         /// 设置系统时间        ///         /// 需要设置的时间        /// 
返回系统时间设置状态,true为成功,false为失败
public static bool SetLocalDateTime(DateTime dt) { Systemtime st; st.year = (short)dt.Year; st.month = (short)dt.Month; st.dayOfWeek = (short)dt.DayOfWeek; st.day = (short)dt.Day; st.hour = (short)dt.Hour; st.minute = (short)dt.Minute; st.second = (short)dt.Second; st.milliseconds = (short)dt.Millisecond; bool rt = SetLocalTime(ref st); return rt; } public static DateTime GetDateTime(long timeStamp) { return new DateTime(1970, 1, 1).AddSeconds(timeStamp).ToLocalTime(); } public static bool GetInternetTime(string url, out DateTime dt, out string errMsg) { dt = DateTime.MinValue; var startDt = DateTime.Now; var port = 13; var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { ReceiveTimeout = 2000 }; try { var iphostinfo = Dns.GetHostEntry(url); var ip = iphostinfo.AddressList[0]; var ipe = new IPEndPoint(ip, port); var iar = socket.BeginConnect(ipe, null, null); if (!iar.AsyncWaitHandle.WaitOne(5000)) { errMsg = "连接超时" + url; return false; } var recvBuffer = new byte[1024]; var sb = new StringBuilder(); var myE = Encoding.UTF8; int nBytes; while ((nBytes = socket.Receive(recvBuffer, 0, 1024, SocketFlags.None)) > 0) { sb.Append(myE.GetString(recvBuffer, 0, nBytes)); } var o = sb.ToString().Split(' '); TimeSpan ts = DateTime.Now - startDt; var setDt = Convert.ToDateTime(o[1] + " " + o[2]).Subtract(-ts); // 减去中途消耗的时间 dt = setDt.ToLocalTime(); Console.WriteLine(@"服务器:{0}时间:{1}", url, setDt); errMsg = ""; return true; } catch (Exception ex) { errMsg = ex.Message; return false; } finally { socket.Close(); } }

  

源码如下:

https://files.cnblogs.com/files/lizhijian/%E8%8E%B7%E5%8F%96%E7%BD%91%E7%BB%9C%E6%97%B6%E9%97%B4.rar

 

 

感谢阅读

转载地址:http://kuebm.baihongyu.com/

你可能感兴趣的文章
百万下载量的 Android 应用后台收集用户信息
查看>>
SQL Server 多表数据增量获取和发布 1
查看>>
C3P0连接池
查看>>
这 25 个开源机器学习项目,一般人我不告诉 Ta
查看>>
【WePY小程序框架实战四】-使用async&await异步请求数据
查看>>
iOS UIImageView(图片)
查看>>
可折叠显示的发光搜索表单
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.2. 表和索引
查看>>
java使用正则表达式判断手机号,固定电话,身份证,邮箱,url,车牌号,日期,ip地址,mac,人名等...
查看>>
新手也能轻松掌握的分布式系统「事务」技巧
查看>>
iOS开发之使用Git的基本使用(一)
查看>>
配置云存储网关在线服务支持多个互联VPC-高速通道版
查看>>
6个步骤从头开始编写机器学习算法:感知器案例研究
查看>>
NCalc 学习笔记 (三)
查看>>
NetBeans 成为 Apache 软件基金会顶级项目
查看>>
SSRF在Redis中反弹shell
查看>>
UML关系图
查看>>
SpringBoot 手写切片/面向切面编程
查看>>
动态 Web Server 技术发展历程
查看>>
使用pymysql(使用一)
查看>>