이것은 UNIX 명령어중에서 "rdate" 명령을 흉내내는 예제입니다.
최대한 비슷하게 만들었습니다.

코드:

/*
Copyright (c) 2002 Information Equipment co.,LTD.
All Right Reserved.

Code by JaeHyuk Cho <minzkn@infoeq.co.kr>

This example !!!
   - Simple is best.
   - Reference RFC 868       -> See http://rfc.sunsite.dk
*/

#if defined(WIN32)
#include <windows.h>
#else
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#endif

#define DEF_RFC_868_CORRESPOND_VALUE    (2208988800lu) /* 00:00:00 1 JAN 1970 GMT */
#define DEF_RFC_868_TIMESERVER_TCP_PORT (37)
#define DEF_RFC_868_TIMESERVER_UDP_PORT (37)

int main(int s_Argc, char *s_Argv[]);

static time_t MZ_GetRemoteTime(const char *s_TimeServer)
{
unsigned long s_Return = 0lu;   
int s_Socket;
struct sockaddr_in  s_SocketAddress_In;
struct hostent     *s_HostEntry;
s_HostEntry = gethostbyname(s_TimeServer);
if(s_HostEntry)
{
  memset((void *)(&s_SocketAddress_In), 0, sizeof(s_SocketAddress_In));   
  s_SocketAddress_In.sin_family = AF_INET;
  s_SocketAddress_In.sin_port = htons(DEF_RFC_868_TIMESERVER_TCP_PORT);
  memcpy((void *)(&s_SocketAddress_In.sin_addr), (void *)(s_HostEntry->h_addr), sizeof(s_SocketAddress_In.sin_addr));
  s_Socket = socket(AF_INET, SOCK_STREAM, 0);
  if(s_Socket >= 0)
  {
   /* TODO: Tick save */    
   if(connect(s_Socket, (struct sockaddr *)&s_SocketAddress_In, sizeof(s_SocketAddress_In)) >= 0)
   {
    if(recv(s_Socket, &s_Return, sizeof(s_Return), 0) == sizeof(s_Return))
    {
     s_Return = ntohl(s_Return) - DEF_RFC_868_CORRESPOND_VALUE; /* Time entry 00:00:00 1 JAN 1970 GMT */
     /* TODO: s_Return += (Tick value / 2) */      
    }
    else fprintf(stderr, "Can not recv time_t from \"%s\" !\n", s_TimeServer);   
   }      
   else fprintf(stderr, "Can not connect to timeserver \"%s\" !\n", s_TimeServer);
#if defined(WIN32)
   closesocket(s_Socket);    
#else   
   close(s_Socket);   
#endif
  }
  else fprintf(stderr, "Can not open socket !\n");
}
else fprintf(stderr, "Can not get host by name !\n");
return((time_t)s_Return);
}

int main(int s_Argc, char *s_Argv[])
{
char *s_TimeServer = "time.bora.net";    
time_t s_RemoteTime;
fprintf(stdout, "rdate v0.0.1 - Code by JaeHyuk Cho <minzkn@infoeq.co.kr>\n\n");
if(s_Argc > 1)s_TimeServer = s_Argv[1];
fprintf(stdout, "Timeserver is %s\n", s_TimeServer);
s_RemoteTime = MZ_GetRemoteTime(s_TimeServer);
if(s_RemoteTime)
{
  fprintf(stdout, "TIME>> %s\n", ctime(&s_RemoteTime));    
  /* TODO: Adjust clock delay */
  /* stime(&s_RemoteTime); */ /* Save time */
}
else fprintf(stderr, "Can not sync from \"%s\" !\n", s_TimeServer);
return(0);
}

/* End of source */
2007/05/08 12:19 2007/05/08 12:19
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/68

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/68

트랙백 주소 :: http://blog.minzkn.com/trackback/68

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/68

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/68

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/68
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/68