시스템 날짜와 시간을 설정해 주는 rdate 명령이 있습니다. 매우 간단하게 시스템의 시간을 설정할 수 있는데, 사용하는 방법은 매우 쉽습니다.

]# rdate -s time.bora.net
]# date
2007. 10. 16. (화) 22:49:47 KST

time.bora.net 서버를 통하면 현재의 시간을 구할 수 있다는 얘기인데, 이 서버를 통해 시간을 구하는 방법에 대해 알아 보도록 하겠습니다. 소스를 먼저 보시겠습니다.

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

#define  BUFF_SIZE   1024

int   main( int argc, char **argv)
{
    int         client_socket;
    struct      sockaddr_in     server_addr;
    struct      hostent        *host_entry;

    time_t      server_time;
    unsigned    long buf_time;

    host_entry = gethostbyname( "time.bora.net");

    if ( !host_entry)
    {
        printf( "gethostbyname() 실행 실패/n");
        exit( 1);
    }

    client_socket = socket( PF_INET, SOCK_STREAM, 0);
    if( -1 == client_socket)
    {
        printf( "socket 생성 실패/n");
        exit( 1);
    }
    memset( &server_addr, 0, sizeof( server_addr));
    server_addr.sin_family     = AF_INET;
    server_addr.sin_port       = htons( 37);
    memcpy((void *)(&server_addr.sin_addr), (void *)(host_entry->h_addr),
                sizeof(server_addr.sin_addr));

    if( -1 == connect( client_socket, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
    {
       printf( "접속 실패n");
    }
    else
    {
        if ( sizeof( buf_time) != read( client_socket, &buf_time, sizeof( buf_time)))
        {
           printf( "시간 정보 구하기 실패\n");
        }
        else
        {
            buf_time = ntohl( buf_time) - 2208988800lu;
            server_time = ( time_t)buf_time;
            printf( "현재 날짜와 시간 : %s\n", ctime(&server_time));
        }
        close( client_socket);
    }
    return 0;
}

프로그램을 실행하면 아래와 같이 현재 시간이 출력됩니다.

]$ ./a.out
현재 날짜와 시간 : Wed Jun  3 22:52:11 2009

]$ 
  • 문자열 주소를 이용하여 서버 IP를 구하기 위해 gethostbyname() 함수를 사용했습니다.
  • gethostbyname() 함수를 사용하기 위해, netdb.h를 include 했습니다.
  • sockaddr_in server_addr의 서버 연결 정보를 넘겨 주기 위해, 아래와 같이 memcpy()를 실행했습니다.

    memcpy((void *)(&server_addr.sin_addr), (void *)(host_entry->h_addr),
    sizeof(server_addr.sin_addr));

  • ctime()을 이용하여 현재 시간 문자열을 구했습니다.

    ctime(&server_time)