1. NetTime "www.time.ac.cn" 
  2. If TimeFromNet = "" Then  
  3. MsgBox "网络标准时间服务器www.time.ac.cn超时!" 
  4. Else  
  5. Time = Mid(TimeFromNet, 12, 8) '设置系统时间  
  6. End If  
  7. End If  
  8. End  
  9. End Sub 

关闭Winsock子程序

  1. Private Sub Winsock1_Close()  
  2. If Winsock1.State <> sckClosed Then  
  3. Winsock1.Close  
  4. End If  
  5. End Sub 

Winsock接收数据事件

  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)  
  2. TimeFromNet = String(bytesTotal, " ")  
  3. Winsock1.GetData TimeFromNet, vbString, bytesTotal  
  4. End Sub 

Winsock出错事件

  1. Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)  
  2. NoSrv = True  
  3. End Sub 

从互联网上标准时间提供网站获取标准时间

  1. Private Sub NetTime(TimeSrv As String)  
  2. NoSrv = False  
  3. TimeFromNet = "" 
  4. If Winsock1.State <> sckClosed Then Winsock1.Close  
  5. Winsock1.RemoteHost = TimeSrv ' "www.time.ac.cn" 或 "time.nist.gov" 
  6. Winsock1.RemotePort = 13  
  7. Winsock1.LocalPort = 0  
  8. Winsock1.Connect  
  9. Do While TimeFromNet = "" '循环等待标准时间网站返回时间数据  
  10. If NoSrv Then Exit Do '若Winsock出错,则跳出循环等待  
  11. Sleep 55  
  12. DoEvents  
  13. Loop  
  14. If Winsock1.State <> sckClosed Then Winsock1.Close  
  15. End Sub 

上面介绍了RFC-867标准和VB例程,显然RFC-867标准采用返回当前时间和日期的格式是字符串格式以及对于daytime协议没有特定的格式例如:中科院国家授时中心为"Mon Jul 26 09:58:57 2004",而美国标准技术院为"53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST)"),这2点似乎都不是太舒服,因此我们希望Internet上的标准时间服务器最好能够返回具有标准格式的数字类型数据,其实RFC在制定RFC-867标准时已经考虑了我们的意见,因为他同时还推出了RFC-868标准,下面就介绍RFC-868:

RFC868 时间协议RFC868 Time Protocol)

本RFC规范了一个ARPA Internet community上的标准.在ARPA Internet上的所有主机应当采用和实现这个标准.此协议提供了一个独立于站点的,机器可读的日期和时间信息.时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数,天哪,也不小呢.设计这个协议的一个重要目的在于,网络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准确的时间观念.不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重要了.

这个协议可以工作在TCP和UDP协议下.下面是通过TCP协议工作的时间协议的工作过程:这里S代表服务器,U代表客户.
S: 检测端口37
U: 连接到端口37
S: 以32位二进制数发送时间
U: 接收时间
U: 关闭连接
S: 关闭连接

服务器在端口37上监听连接.当连接建立后,服务器返回一个32位的时间值,然后关闭连接.这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接.


相关内容