VALIDANDO DATA VIA A.NTP.BR

 Tópico anterior Próximo tópico Novo tópico

VALIDANDO DATA VIA A.NTP.BR

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#497204 - 12/06/2021 14:12:51

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Bom dia caros programadores.

gente estou tentando criar uma rotina para validar a data do PC
na verdade já esta até funcionando
uso o seguinte código

     Public Function ValidarData() As DateTime
        Try
            Const ntpServer As String = 'a.ntp.br'
            Dim ntpData = New Byte(47) {}
            ntpData(0) = &H1B
            Dim addresses = Dns.GetHostEntry(ntpServer).AddressList
            Dim ipEndPoint = New IPEndPoint(addresses(0), 123)
            Dim socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

            socket.Connect(ipEndPoint)
            socket.ReceiveTimeout = 3000
            socket.Send(ntpData)
            socket.Receive(ntpData)
            socket.Close()
            Const serverReplyTime As Byte = 40
            Dim intPart As ULong = BitConverter.ToUInt32(ntpData, serverReplyTime)
            Dim fractPart As ULong = BitConverter.ToUInt32(ntpData, serverReplyTime + 4)
            intPart = SwapEndianness(intPart)
            fractPart = SwapEndianness(fractPart)

            Dim milliseconds = (intPart * 1000) + ((fractPart * 1000) / &H100000000L)
            Dim networkDateTime = (New DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(CLng(milliseconds))

            Return networkDateTime.ToLocalTime()
        Catch ex As Exception
            Err.Clear()
        End Try
  

o código acima conecta ao servidor ntp(a.ntp.br)
e me retorna a data atualizada

a única questão e que essa rotina so esta funcionando em IPV4, quando o PC do cliente usa IPV6, não funciona
eu não encontrei nada que me auxilia-se, nas pesquisas.
então agradeço qualquer ajuda

Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


Resposta escolhida #497209 - 14/06/2021 11:28:14

OCELOT
SOROCABA
Cadast. em:Março/2012


Experimento trocar a linha
Dim socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

por
Dim socket = New Socket(addresses(0).AddressFamily, SocketType.Dgram, ProtocolType.Udp)

Assim se for um IPv6 ele deve pegar o AddressFamily correto direto pelo IP retornado, pois quando é IPv6 tem que usar o AddressFamily.InterNetworkV6



#497210 - 14/06/2021 15:41:35

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Citação:
:
Experimento trocar a linha
Dim socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

por
Dim socket = New Socket(addresses(0).AddressFamily, SocketType.Dgram, ProtocolType.Udp)

Assim se for um IPv6 ele deve pegar o AddressFamily correto direto pelo IP retornado, pois quando é IPv6 tem que usar o AddressFamily.InterNetworkV6


funcionou perfeitamente
cara muito obrigado mesmo

Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MFLAVIO em 14/06/2021 15:41:42