Sincronizar la hora del sistema

con un Servidor NIST
DJP Sincro Tray

Fecha: 15 de Septiembre 2003 (18/Sep/2003)
Autor: Paulo Conde [email protected]


Muchas veces queremos sincronizar nuestro sistema con la hora exacta, (por ejemplo si desarrollamos una aplicaci�n que venda n�meros de loter�a siempre querremos que sepa a que hora va a ser el sorteo). Esto es posible mediante un servidor de hora (NIST). La conexi�n con el servidor se efect�a utilizando TCP. Las direcciones de algunos servidores las coloque en un ComboBox (si alguien conoce otras le agradecer�a me lo informara -ver lista adicional-), el puerto en que normalmente escuchan es el puerto 13.

La aplicaci�n se ejecuta como un icono en la barra de tareas, y efect�a actualizaciones cada cierto tiempo.

Muestro aqu� las partes m�s importantes de la aplicaci�n:

Public Sub New()
    MyBase.New()

    'El Dise�ador de Windows Forms requiere esta llamada.
    InitializeComponent()

    'Oculto el icon tray para comprobar primero que no existan otras instancias de la aplicaci�n ejecut�ndose
    NotifyIcon1.Visible = False
End Sub
'
'Para determinar si existen instancias previas de la aplicaci�n en ejecuci�n
Function PrevInstance() As Boolean
    If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
        Return True
    Else
        Return False
    End If
End Function
'
'Conexi�n con el servidor nist y obtenci�n y conversi�n de la cadena obtenida
Private Sub mnuSincronizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSincronizar.Click
    Dim tcp As New System.Net.Sockets.TcpClient
    Try
        With tcp
            'Establecemos la conexi�n con el servidor en  el puerto en que este escuchando
            .Connect(cmbServidor.Text, Val(txtPuerto.Text))
            Dim data As [Byte]()
            Dim stream As System.Net.Sockets.NetworkStream = tcp.GetStream()
            '
            'Leemos la hora y la fecha
            data = New [Byte](256) {}
            Dim responseData As [String] = [String].Empty
            Dim bytes As Int32 = stream.Read(data, 0, data.Length)
            '
            'Cortamos la parte de la cadena que nos interesa
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes).Trim(Chr(10)).Substring(6, 17)
            '
            'La convertimos a un formato de fecha manejable
            responseData = responseData.Substring(6, 2) & "/" & responseData.Substring(3, 2) & "/" & responseData.Substring(0, 2) & " " & responseData.Substring(9)
            '
            'Cerramos la conexi�n
            tcp.Close()
            '
            'Asignamos la hora a nuestro sistema
            'Le resto cuatro horas porque en Venezuela la hora es -4GMT
            'deben adaptar el valor a su zona horaria
            TimeOfDay = DateTime.Parse(responseData).AddHours(-4)
            Today = DateTime.Parse(responseData).AddHours(-4)
        End With
    Catch c As System.Net.Sockets.SocketException
        MsgBox("No se puede conectar con el servidor", MsgBoxStyle.Critical, "DJP Sincro Tray")
    End Try
End Sub
'
'Si no hay otras instancias en ejecuci�n se muestra el icon tray sino salimos
Private Sub frmSetup_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If PrevInstance() Then
        Me.Close()
    Else
        'Sincronizamos la hora y la fecha
        mnuSincronizar_Click(Me, New System.EventArgs)
        'Mostramos el icono en la barra de estado de Windows
        'las sincronizaciones se efectuaran autom�ticamente
        NotifyIcon1.Visible = True
    End If
End Sub

Espero les sea �til.

Fichero con el c�digo de ejemplo (DJPSincroTray.zip - Tama�o 14.8 KB)
 


Nota del Guille:

Otros servidores NIST (aqu� se incluyen tambi�n los incluidos en el c�digo original)

ashe.cs.tcd.ie
bernina.ethz.ch
black-ice.cc.vt.edu
boulder.nist.gov
clepsydra.dec.com
clock.psu.edu
clock.tricity.wsu.edu
constellation.ecn.uoknor.edu
delphi.cs.ucla.edu
eagle.tamu.edu
esavax.esa.lanl.gov
fartein.ifi.uio.no
fuzz.psc.edu
gazette.bcm.tmc.edu
gilbreth.ecn.purdue.edu
harbor.ecn.purdue.edu
heechee.esa.lanl.gov
india.Colorado.EDU
jane.jpl.nasa.gov
kuhub.cc.ukans.edu
lane.cc.ukans.edu
lib1.tcd.ie
libra.rice.edu
louie.udel.edu
molecule.ecn.purdue.edu
nic.near.net
noc.near.net
ntp-0.cso.uiuc.edu
ntp-1.cso.uiuc.edu
ntp-2.cso.uiuc.edu
ntp.adelaide.edu.au
ntp.cox.smu.edu
ntp.css.gov
ntp.olivetti.com
ntp.univ-lyon1.fr
ntp0.cornell.edu
ntp0.strath.ac.uk
ntp1.strath.ac.uk
ntp2.strath.ac.uk
ntp3.strath.ac.uk
ntp4.strath.ac.uk
salmon.maths.tcd.ie
sundial.columbia.edu
tick.cs.unlv.edu
time-a.nist.gov
time-b.nist.gov
time-nw.nist.gov
time.nist.gov
time-A.timefreq.bldrdoc.gov
time-B.timefreq.bldrdoc.gov
time-C.timefreq.bldrdoc.gov
timeserver.cs.umb.edu
tmc.edu,tock.cs.unlv.edu
vtserf.cc.vt.edu
wuarchive.wustl.edu
yoyo.aarnet.edu.au
zeus.tamu.edu

ir al índice