소강좌제목 : 컴퓨터 네트웍 프로그래밍 이전 강좌: 제2장 UNIX BSD 소켓 시스템 콜 다음강좌: 제4장 UNIX 소켓 응용프로그래밍
제3장 클라이언트-서버 토크 프로그램
3장에서는 소켓을 이용하여 클라이언트와 서버의 통신 프로그래밍을 작성하는 것을 체계적으로 설명하기 위하여 talk 프로그램을 소개하겠다. 토크 클라이언트와 토크 서버는 서로 연결된 후 각 사용자가 키보드에서 입력한 메세지를 상대방에게 전송하고 상대방이 전송한 메시지를 화면에 출력하는 기능을 수행한다. 3.1절에서는 토크 클라이언트 프로그램 talk_client.c를, 3.2절에서는 토크 서버 프로그램 talk_ server.c를 소개하며 클라이언트와 서버의 소켓 생성 및 연결과정은 2.3절과 2.4절에서 설명한 내용과 동일하므로 여기서는 생략하겠다.
3.1 토크 클라이언트 프로그램
3.1.1 프로그램 주요부분 설명
- 토크 클라이언트 프로그램 talk_client.c는 사용자의 키보드 입력처리와 서버와의 통신 두 가지 일을 동시에 수행해야 하는데 이를 위해 fork() 시스템 콜을 사용해 두 개의 프로세스를 생성한다.
- 부모 프로세스는 사용자가 입력한 메시지를 읽어 서버로 전송하고 자식 프로세스는 서버가 전송한 메시지를 소켓에서 읽어 화면에 출력한다.
- 한편 사용자의 키보드 입력을 받기 위해 readline() 함수를 새로 정의하였는데 readline()은 첫번째 인자로 주어진 파일기술자로부터 '\n'이 나올 때까지 메시지를 읽어 버퍼에 저장한다. readline() 함수에서는 키보드 입력을 위하여 표준입력용 파일기술자 0을 사용한다.
- 한편 사용자가 종료문자(escape char)를 입력하면 부모 프로세스가 자식 프로세스를 종료시키고 프로그램을 종료시키도록 하였다.
- 본 예제에서는 종료문자로 'exit'를 사용하였다. 아래는 이 부분을 수행하는 코드인데 입력된 문자열(sendline)이 종료문자(즉, 'exit')와 같은지 strncmp()를 이용하여 비교하고 있다.
if(strncmp(sendline, escapechar, 4) == 0) { kill(pid, SIGQUIT);
break;
}
▶ talk_client.c 프로그램 리스트
▶ readline.c 프로그램 리스트
- readline.c 는 주어진 파일기술자 fd로부터 '\n'이 나타날 때까지 즉, 한 행을 읽어 들이는 사용자 정의 함수 readline()으로, 읽은 메시지를 함수 인자로 주어진 문자열 *ptr에 저장하고 읽은 문자의 수를 바이트 단위로 리턴한다.
- 한편, 인자 maxlen은 한 번에 읽을 수 있는 최대 문자열의 크기를 지정한다.
3.2 토크 서버 프로그램
- 여기서는 3.1절에서 소개한 토크 클라이언트 talk_client.c의 서버 역할을 하는 토크 서버 프로그램 talk_server.c를 소개한다.
- talk_server.c의 소켓 생성 및 클라이언트와의 연결 절차는 2.4절에서 설명한 방법과 동일하다.
- 한편 서버에서도 클라이언트에서와 같이 사용자 키보드 입력과 메시지 송수신 두 가지 기능을 동시에 수행하기 위해 fork() 시스템 콜을 이용한다.
3.2.1 프로그램 주요부분 설명
- 서버는 listen()을 호출하여 소켓을 수동 대기모드로 바꾸고 accpet()를 호출하여 클라이언트로부터의 연결을 기다린다.
- 연결이 이루어지면 fork() 시스템 콜을 이용하여 서버 프로그램을 복제한다.
- 부모 프로세스는 사용자의 키보드 입력을 받아 클라이언트에게 전송하며, 자식 프로세스는 클라이언트가 보내온 메시지를 화면에 출력한다.
- 서버 자신의 IP 주소로는 talk_server.c 프로그램이 임의의 호스트에서 수행될 수 있도록 INADDR_ANY로 지정하였다.
- talk_server.c가 사용할 포트번호는 프로그램 실행시에 명령문 인자로 입력한 값(argv[1])을 사용한다.
server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(atoi(argv[1]));
- 한편 서버는 클라이언트가 메시지 'exit'를 전송해 오면 토크 서비스를 중단하고 클라이언트와의 연결을 끊도록 구현하였다.
▶ talk_server.c 프로그램 리스트
소강좌제목 : 컴퓨터 네트웍 프로그래밍 이전 강좌: 제2장 UNIX BSD 소켓 시스템 콜 다음강좌: 제4장 UNIX 소켓 응용프로그래밍
'UNIX_LINUX_C_C++' 카테고리의 다른 글
[펌] 공유 메모리(shared memory) 의 사용 (0) | 2011.10.14 |
---|---|
[펌] 아파치 http 서버의 확장모듈을 컴파일하고 설치하는 도구 (0) | 2011.10.14 |
[펌] 제4장 UNIX 소켓 응용 프로그래밍 (0) | 2011.10.14 |
[펌] 제1장 네트웍 프로그래밍의 이해 (0) | 2011.10.14 |
[펌] 제2장 UNIX BSD 소켓 시스템 콜 (0) | 2011.10.14 |