강좌 & 팁
글 수 2,412
2009.06.04 06:28:19 (*.55.127.122)
89102
시스템 날짜와 시간을 설정해 주는 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)