현재강좌 : UNIX 소켓 응용 프로그래밍 이전 4.3 채팅 클라이언트 프로그램 다음: 4.5 소켓 함수 처리시간 측정


4.4 멀티서버

▶ 멀티서버란 하나의 프로세스에서 두 가지 이상의 서비스를 동시에 제공하거나, 동일한 서비스를 두가지 이상의 프로토콜(즉, TCP와 UDP)로 제공하는 서버를 말한다.

▶ 멀티서버의 장점은 하나의 프로세스가 하나의 서비스를 제공하는 것에 비해 시스템의 자원을 적게 사용하면서 동일한 서비스를 제공한다는 것이다.

▶ 본 절에서는 TCP를 통해 두 개의 서비스 echo와 daytime을 제공하는 멀티서버 프로그램을 작성하며, 두 가지 서비스에 대한 요청을 구분하기 위해 select() 시스템 콜을 사용한다.

4.4.1 프로그램 개요

▶ 본 절에서 소개할 멀티서버 프로그램 multi_server.c에서는 두 가지 서비스 echo와 daytime를 제공하기 위하여 두 개의 소켓을 사용한다.

▶ 즉, echo 서비스는 소켓번호 echo_fd를, daytime 서비스는 소켓번호 daytime_fd를 아래와 같이 만들어 사용한다.

/* echo 서비스를 위한 소켓 생성 */

echo_fd = socket(PF_INET, SOCK_STREAM, 0);

/* daytime 서비스를 위한 소켓 생성 */

daytime_fd = socket(PF_INET, SOCK_STREAM, 0);

▶ 소켓을 생성한 다음 무한루프를 돌며 클라이언트의 서비스 요구를 기다린다.

▶ FD_SET 매크로를 사용하여 소켓 echo_fd와 daytime_fd를 fd_set 타입의 구조체 read_fds에 지정하며 향후에 이 소켓에서 읽기 변화가 발생하면 select() 문이 리턴되도록 한다.

▶ 프로그램은 echo_fd 또는 daytime_fd가 읽기 가능한 상태가 될 때까지 select() 문에서 기다린다.

while(1) {

FD_SET(echo_fd, &read_fds);

FD_SET(daytime_fd, &read_fds);

select(nfds, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);

}

▶ select() 문이 리턴되었을 때 어떤 서비스 요구가 발생하였는지를 구분하기 위하여 FD_ISSET 매크로를 사용한다.

▶ FD_ISSET는 read_fds 구조체에서 해당 소켓이 세트되어 있으면 양수값인 소켓번호를 리턴한다.

/* echo 클라이언트가 접속을 요구해 경우 */

if(FD_ISSET(echo_fd, &read_fds))

echo_process(s); /* echo 서비스 수행 */

/* daytime 클라이언트가 접속을 요구해 경우 */

if(FD_ISSET(daytime_fd, &read_fds))

daytime_process(s); /* daytime 서비스 수행 */

▶ echo_process()는 echo를 처리하도록 멀티서버에서 구현한 사용자 정의 함수로서 소켓번호 echo_fd를 함수 인자로 받으며 소켓을 통해 입력된 문자열을 그 소켓으로 그대로 출력한다.

▶ 아래는 echo_process() 구현 부분이다.

int echo_process(int echo_fd) {

while((len = read(echo_fd, buf, sizeof(buf))) != 0)

write(echo_fd, buf, len);

return 0;

}

▶ daytime_process()는 소켓번호 daytime_fd를 인자로 받으며, time() 시스템 콜을 이용하여 시스템의 현재 시각을 얻는다.

▶ctime() 시스템 콜을 이용하여 아래와 같은 형태의 시각을 나타내는 문자열로 변경한 후 이 문자열을 클라이언트로 전송한다 (time()에 관하여는 4.5절에서 다시 설명한다).

Wed May 21 12:45:35 1997

 

▶ 아래는 daytime_process() 구현 부분이다.

int daytime_process(int daytime_fd) {

time(&now);

sprintf(buf, "%s\n", ctime(&now));

write(daytime_fd, buf, strlen(buf));

return 0;

}

multi_server.c 프로그램 리스트


현재강좌 : UNIX 소켓 응용 프로그래밍 이전 4.3 채팅 클라이언트 프로그램 다음: 4.5 소켓 함수 처리시간 측정