100分求够获取网络时间原理 不期望有可运行的代码,只求获取网络时间的原理及一些必要的示例程序.希望各位朋友能够慷慨相助,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.codeproject.com/ 有代码 用.NET实现RFC868协议获取网络时间用.NET实现RFC868协议获取网络时间昨天看CSDN上有人问如何在.NET下获取网络上某台服务器的时间,我查了一下描述网络时间协议的RFC868和RFC867。发觉并不难实现,当晚将其做成了.NET控件,并测试通过,拿出来与大家分享。 使用Socket类实现同服务器37端口的连接,建立连接后接收对方基于RFC868协议的二进制时间数据,将数据转换为.NET自身支持的DateTime类型,并转换为东8区时间。 主要实现代码为下面的函数: /// <summary> /// 获取服务器的网络时间,并转换为东区时间 /// </summary> /// <returns>调用成果返回服务器的网络时间,失败返回System.DateTime.MinValue</returns> public System.DateTime GetServerDateTime() { System.DateTime ret; int nSize; ret = System.DateTime.MinValue; byte[] RecvBuf = new byte[1024]; //byte[] SendBuf = new byte[0]; RecvBuf.Initialize(); IPEndPoint ServerEp = new IPEndPoint(IPAddress.Parse(FServerAddress),FPort); using (System.Net.Sockets.Socket Time_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) { Time_Socket.Connect(ServerEp); //Time_Socket.Send(SendBuf); nSize = Time_Socket.Receive(RecvBuf); Time_Socket.Close(); } if (nSize ==4)//接收到一个位的整型 { try { // 这里将byte数组转换为int类型 int recvInt = BitConverter.ToInt32(RecvBuf, 0); // 这里转换网络字节序为主机字节序 recvInt = System.Net.IPAddress.NetworkToHostOrder(recvInt); // 转换为真正的秒数 uint ServerSecs = (uint)(recvInt); // The ServerSecs is the number of seconds since 00:00 (midnight) 1 January 1900 GMT ret = DateTime.Parse("1900-01-01 00:00:00"); ret = ret.AddSeconds(ServerSecs); ret = ret.AddHours(8); // 转换为东区时间 } catch (Exception e) { Console.WriteLine(e.Message); } } return ret; } 找一个提供时间的页面get得到后也可以 http://tf.nist.gov/service/time-servers.html还需要特别说明一下 FServerAddress应为一个字符串形式的IP地址,FPort应为一个int型的端口号根据协议规定应为 37要想知道时间服务器的地址可以到这个网页上查找http://www.boulder.nist.gov/timefreq/service/time-servers.html hertcloud(·£孙子兵法£·)兄给出的组件看似完善,实则是不可运行的,而且也并未给出这两个参数的接口. 小写转大写函数 小Bug ??谁帮忙看看?? 用过DotNetBar的朋友看过来 求一SQL 关于判断数据库是否可用的问题 这个功能怎么实现??请教 DataGridView的小问题? xml与窗体控件问题,简单的 庆祝.NET2.0今天在中国发布 关于如何写上传后文件“摘要”内容?? 用DataGrid显示两个主从表的时候,如果某些父记录没有子记录的话,前面的+依然还在?怎样消除? 如何当鼠标和键盘长时间不动的时候让程序自动退出? 问一个关于checkedListBox的菜问题!
用.NET实现RFC868协议获取网络时间
昨天看CSDN上有人问如何在.NET下获取网络上某台服务器的时间,我查了一下描述网络时间协议的RFC868和RFC867。发觉并不难实现,当晚将其做成了.NET控件,并测试通过,拿出来与大家分享。 使用Socket类实现同服务器37端口的连接,建立连接后接收对方基于RFC868协议的二进制时间数据,将数据转换为.NET自身支持的DateTime类型,并转换为东8区时间。 主要实现代码为下面的函数: /// <summary> /// 获取服务器的网络时间,并转换为东区时间 /// </summary> /// <returns>调用成果返回服务器的网络时间,失败返回System.DateTime.MinValue</returns> public System.DateTime GetServerDateTime() { System.DateTime ret; int nSize; ret = System.DateTime.MinValue; byte[] RecvBuf = new byte[1024]; //byte[] SendBuf = new byte[0]; RecvBuf.Initialize(); IPEndPoint ServerEp = new IPEndPoint(IPAddress.Parse(FServerAddress),FPort); using (System.Net.Sockets.Socket Time_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) { Time_Socket.Connect(ServerEp); //Time_Socket.Send(SendBuf); nSize = Time_Socket.Receive(RecvBuf); Time_Socket.Close(); } if (nSize ==4)//接收到一个位的整型 { try { // 这里将byte数组转换为int类型 int recvInt = BitConverter.ToInt32(RecvBuf, 0); // 这里转换网络字节序为主机字节序 recvInt = System.Net.IPAddress.NetworkToHostOrder(recvInt); // 转换为真正的秒数 uint ServerSecs = (uint)(recvInt); // The ServerSecs is the number of seconds since 00:00 (midnight) 1 January 1900 GMT ret = DateTime.Parse("1900-01-01 00:00:00"); ret = ret.AddSeconds(ServerSecs); ret = ret.AddHours(8); // 转换为东区时间 } catch (Exception e) { Console.WriteLine(e.Message); } } return ret; }
还需要特别说明一下 FServerAddress应为一个字符串形式的IP地址,FPort应为一个int型的端口号根据协议规定应为 37
要想知道时间服务器的地址可以到这个网页上查找
http://www.boulder.nist.gov/timefreq/service/time-servers.html
hertcloud(·£孙子兵法£·)兄给出的组件看似完善,实则是不可运行的,而且也并未给出这两个参数的接口.