================================================================================================
우연찮게 발견한 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);
}
================================================================================================
'IT_Programming > Network Programming' 카테고리의 다른 글
[펌] 멀티 프로세스 / 멀티 쓰레드 / 멀티 플렉싱 기법의 장점과 단점 (0) | 2009.07.02 |
---|---|
[Winsock] TCP_IP Half Close를 이용한 파일전송 (0) | 2009.07.02 |
[WinSock] 열린 포트 검색하기 (0) | 2009.07.01 |
[Linux C] 에코 서버, 에코 클라이언트 만들기 (sinal intterrupt 적용) (0) | 2009.06.30 |
[펌] TCP/IP 소켓 프로그래밍 with C# (0) | 2009.03.05 |