본문 바로가기

UNIX_LINUX_C_C++

[펌] 제3장 클라이언트-서버 토크 프로그램

소강좌제목 : 컴퓨터 네트웍 프로그래밍 이전 강좌: 제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 소켓 응용프로그래밍