2013.07.05 11:28


이번시간에는 소켓을 이용해 간단한 채팅 프로그램을 만들어 보도록 하겠습니다.

먼저 채팅 프로그램의 서버와 클라이언트의 통신 순서를 그림을 통해 알아보도록 하겠습니다.

아래 그림을 봐주세요.

그림에서 보는바와 같이 서버와 클라이언트는 통신을 하게 됩니다.

순서를 간단히 살펴보면 다음과 같습니다.

1. 서버 프로그램에서 서버 소켓이 클라이언트의 접속을 기다립니다.
서버측에서 클라이언트의 접속을 기다리기 위해 소켓을 생성후 Listen() 함수를 실행해 클라이언트가 접속할 때까지 대기 하도록 합니다. 서버 소켓을 생성할 때 다른 응용프로그램과의 구분을 위해 특정 포트를 지정해야 합니다.(여기서는 1470번 포트를 사용하도록 하겠습니다.)

2. 클라이언트 프로그램에서 서버 소켓에 접속을 요청합니다.
서버가 Listen()함수를 실행하여 대기 상태에 있을 때 클라이언트 프로그램에서 Connect() 함수를 호출하면 접속할 수 있습니다.

3. 데이터 송수신
클라이언트가 서버와 접속에 성공하면 서버와 클라이언트는 각각 소켓 객체를 갖게 됩니다. 각각의 소켓은 데이터 송수신을 위해 사용됩니다.

그럼 위와 같은 순서로 동작하게될 채팅 프로그램을 작성해 보도록 하겠습니다.


먼저 서버 프로그램을 만들어 보겠습니다.

채팅 서버는 클라이언트의 요청을 받아줄 소켓과 실제 클라이언트와 통신을 담당할 소켓(자소켓)이 필요합니다.
CSocket의 파생 클래스에 OnAccept() 함수를 재정의 해야 합니다. 클라이언트의 연결 요청이 발생하였을 때 클라이언트와 통신을 담당할 소켓을 생성해 주는 코드를 기술하게 됩니다.
클라이언트와 통신을 담당할 자소켓 클래스 역시 CSocket의 파생 클래스여야 하고 OnReceive() 함수를 재정의 해야 합니다. 이 함수에는 클라이언트에서 데이터를 송신하면 이를 수신하는 코드를 기술하게 됩니다.

먼저 윈도우 소켓을 지원받는 프로젝트 생성을 위해 대화상자 기반으로 MFC 프로젝트를 생성합니다. (프로젝트명은 ChatServer로 하겠습니다.)

아래 그림과 같이 채팅 서버 GUI를 구성합니다.

다음으로 클라이언트의 연결 요청을 기다리며 대기하는 서버 소켓 클래스와 클라이언트와 통신을 담당하게될 자소켓을 CSocket의 파생 클래스로 정의합니다.

아래 그램과 같이 MFC 클래스 마법사를 이용해서 CServerSocket과 CChildSocket 클래스를 CSocket의 파생 클래스로 구현합니다.

다음으로 CChatServerApp 클래스에 클라이언트의 접속을 위해 대기하는 서버 소켓과 통신을 위한 자소켓을 위한 멤버 변수 아래 그림과 같이 선언합니다.

아래와 같이 생성자에 추가한 멤버 변수를 초기화 합니다.

서버 소켓과 자소켓 객체가 어플리케이션 클래스에 생성이 되었습니다.

이제 접속과 데이터 송수신에 필요한 함수를 만들도록 하겠습니다.

필요한 함수는 다음과 같습니다.

void InitServer()

서버 소켓 초기화

void CleanUp()

소켓을 닫고 메모리 해제

void SendData(CString strData)

데이터 송신

void ReceiveData()

데이터 수신

void Accept()

접속 허용

void CloseChild()

자소켓 닫고 메모리 해제

각각의 함수는 아래와 같이 내용을 구현합니다.

함수 구현까지 마쳤습니다.

이제 남은 작업은 데이터 송수신을 위한 가상함수 재정의 부분과 대화상자 클래스에서 서버 소켓을 초기화 하고 데이터를 전송하는 부분입니다.

남은 작업은 다음시간에 계속 이어가도록 하겠습니다.

감사합니다.

이글은 초보 개발자를 위한 비주얼 C++ MFC 입문과 정석용의 TCP/IP 소켓 프로그래밍 책을 참고하여 작성하였습니다.


신고


Posted by injunech

티스토리 툴바