Como criar um servidor de hora usando o protocolo NTP

Um simples client de Tempo em C, rapido e eficaz,

SlyCoober_br80

4/16/20242 min read

Como criar um servidor de hora usando o protocolo NTP

Neste post, vamos aprender como criar um servidor de hora utilizando o protocolo NTP (Network Time Protocol). O NTP é responsável por sincronizar o relógio de um computador com servidores de tempo confiáveis na Internet. Vamos mostrar um exemplo de código em C, utilizando a biblioteca de sockets do BSD, para criar um cliente de hora básico.

O que é o protocolo NTP?

O protocolo NTP é um protocolo de rede utilizado para sincronização de tempo em computadores. Ele permite que os dispositivos obtenham a hora correta de servidores de tempo confiáveis na Internet. O NTP foi desenvolvido para solucionar problemas de sincronização de tempo em redes, garantindo que todos os dispositivos estejam com o relógio sincronizado.

Código em C para um cliente de hora

Aqui está um exemplo de código em C que utiliza a biblioteca de sockets do BSD para criar um cliente de hora simples:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define NTP_PORT 123
#define NTP_SERVER "pool.ntp.org"

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[48];

    // Criação do socket
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("Erro ao criar o socket");
        exit(1);
    }

    // Configuração do endereço do servidor
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(NTP_PORT);
    if (inet_aton(NTP_SERVER, &server_addr.sin_addr) == 0) {
        perror("Erro ao converter o endereço do servidor");
        exit(1);
    }

    // Envio da requisição de hora
    memset(buffer, 0, sizeof(buffer));
    buffer[0] = 0x1B;
    if (sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("Erro ao enviar a requisição de hora");
        exit(1);
    }

    // Recebimento da resposta do servidor
    memset(buffer, 0, sizeof(buffer));
    if (recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL) == -1) {
        perror("Erro ao receber a resposta do servidor");
        exit(1);
    }

    // Conversão do timestamp para a hora local
    time_t timestamp = ntohl(((time_t*)(buffer + 40))[0]) - 2208988800;
    struct tm* timeinfo = localtime(&timestamp);

    // Impressão da hora
    printf("Hora atual: %02d:%02d:%02dn", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);

    // Fechamento do socket
    close(sockfd);

    return 0;
}

Este código cria um socket UDP e envia uma requisição de hora para o servidor NTP "pool.ntp.org". Em seguida, recebe a resposta do servidor, converte o timestamp para a hora local e imprime o resultado.

Este é apenas um exemplo básico para entender o funcionamento do protocolo NTP e como obter a hora correta de um servidor. É importante ressaltar que existem implementações mais robustas e seguras do protocolo NTP disponíveis, que devem ser utilizadas em ambientes de produção.

Espero que este post tenha sido útil para entender como criar um servidor de hora utilizando o protocolo NTP. Caso tenha alguma dúvida ou sugestão, deixe seu comentário abaixo.