IT_Programming/Network Programming

[UDP] strftime()를 이용해서 날짜와 시간 문자열 구하기

JJun ™ 2009. 6. 30. 17:43

================================================================================================

우연찮게 발견한 strftime()함수를 사용해서 만들어봤다================================================================================================

 

[참고내용]

출처: http://forum.falinux.com/zbxe/?mid=C_LIB&page=6&document_srl=408358&listStyle=&cpage=

 

strftime (char *restrict s, size_t maxsize, const char *restrict format,

            const struct tm *restrict timeptr)

 

헤더 time.h
형태 size_t strftime (char *restrict s, size_t maxsize, const char *restrict format,

                                              const struct tm *restrict timeptr); 
 
인수 char *restrict s 문자열을 받을 버퍼 포인터  
         size_t maxsize 버퍼의 크기 
         const char *restrict format 날짜와 시간 정보를 나열하기 위한 문자열 포맷 
         const struct tm *restrict timeptr 날짜와 시간 정보 

 

반환 size_t 문자열의 길이  

 

*restrict format 안에 들어가는 포맷 옵션들.. 

변환 문자열 의미 변환 문자열 의미
%a 요일 이름의 약자 %M 분(00-59)
%A 요일 이름 %p AM 또는 PM
%b 월 이름의 약자 %S 초(00-59)
%B 월 이름 %w 요일(0-6)
%c 지역 날짜와 시간 %x 지역 날짜
%d 날짜( 01-31) %X 지역 시간
%H 시간(00-23) %y 연도(00-99)
%l(아이) 시간(01-12) %Y 연도(예, 2003)
%j 1월 1일 이후의 날짜(001-366) %% 퍼센트 기호(%)
%m 월(01-12)

 

================================================================================================

 

[실행화면]

 

 

================================================================================================

 

[소스코드]

 

datetime_server.c

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

 

#define BUFSIZE  30

 

void conn_init(int *serv_sock, struct sockaddr_in *serv_addr, int port);
void error_handling(char *message);

 

int main(int argc, char *argv[])
{
     int serv_sock, clnt_addr_size;
     struct sockaddr_in serv_addr, clnt_addr;
     struct tm *area;
     char message[BUFSIZE];
     time_t t;

 

     if(argc != 2)
     {
          printf("Usage : %s <PORT>\n", argv[0]);
          exit(1);
     }

    

     t = time(NULL);
 
     memset(&serv_addr, 0, sizeof(serv_addr));
     conn_init(&serv_sock, &serv_addr, atoi(argv[1]));

    

     if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
          error_handling("bind() Error!");

 

     while(1)
     {
          clnt_addr_size = sizeof(clnt_addr);
          recvfrom(serv_sock, message, BUFSIZE, 0, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
    
          if(!strcmp(message, "y\n")) // 클라이언트가 요청을 하면...
          {

               // 서버의 시간 정보를 날린다.
               area = localtime(&t);
               sendto(serv_sock, area, 100, 0, (struct sockaddr *)&clnt_addr, sizeof(clnt_addr));
          }
     }

 

    close(serv_sock); 

    

    return 0;
}

 

void conn_init(int *serv_sock, struct sockaddr_in *serv_addr, int port)
{
     *serv_sock = socket(PF_INET, SOCK_DGRAM, 0);
     serv_addr->sin_family = AF_INET;
     serv_addr->sin_addr.s_addr = htonl(INADDR_ANY);
     serv_addr->sin_port = htons(port);
}

 

void error_handling(char *message)
{
     fputs(message, stderr);
     fputc('\n', stderr);
     exit(1);
}

------------------------------------------------------------------------------------------------

 

- datetime_client.c 

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

 

#define BUFSIZE  100

 

void conn_init(int *sock, struct sockaddr_in *serv_addr, char *IPAddress, int port);
void error_handling(char *message);

 

int main(int argc, char *argv[])
{
     int sock, addr_size;
     struct sockaddr_in serv_addr, from_addr; 
     struct tm time_local;
     char message[BUFSIZE];

    

     if(argc != 3)
     {
          printf("Usage : %s <IP> <PORT>\n", argv[0]);
          exit(1);
     }

    

     memset(&serv_addr, 0, sizeof(serv_addr));
     conn_init(&sock, &serv_addr, argv[1], atoi(argv[2]));

 

     while(1)
     {
          fputs("time 서버에 접속하시겠습니까? (y/n): ", stdout);
          fgets(message, sizeof(message), stdin);

        

          if(!strcmp(message, "n\n")) // 클라이언트의 요청거절
               break;
  

          // 접속하고 싶을 때 전송
          sendto(sock, message, strlen(message), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

          

          addr_size = sizeof(from_addr);
          // 서버의 시간을 받아온다. recvfrom의 두번째 인자가 void 포인터 타입이기 때문에 구조체 전송 가능

          recvfrom(sock, &time_local, 100, 0, (struct sockaddr *)&from_addr, &addr_size);

  

          // 출력 하고자 하는 양식으로 설정
          strftime(message, BUFSIZE, "%Y년 %m월 %d일 %H시 %M분", &time_local);
          printf("서버에서 받은 시간은 %s\n", message); // 출력
     }

    

     close(sock);

    

     return 0;
}

 

void conn_init(int *sock, struct sockaddr_in *serv_addr, char *IPAddress, int port)
{
     *sock = socket(PF_INET, SOCK_DGRAM, 0);
     serv_addr->sin_family = AF_INET;
     serv_addr->sin_addr.s_addr = inet_addr(IPAddress);
     serv_addr->sin_port = htons(port);
}

 

void error_handling(char *message)
{
     fputs(message, stderr);
     fputc('\n', stderr);
     exit(1);
}

 

================================================================================================