2008년 12월 29일 월요일

Visual C++에서 제공하는 MFC 라이브러리에서 제공하는 소켓관련 클래스

버클리 소켓과 윈속의 차이점은 무엇인가?

Unix는 선점형 이고 윈도우는 비선점형이라는 것이 근본적인 차이점이다. 물론 window 95는 선점형이기는 하지만 약간은 불완전한 구조로 되어 있으며 window NT는 상당히 완전적인 선점형이다.
여기에서 문제가 되고 있는 것은 데이터를 주고받는 것에 관련된 블록킹 모드의 함수들이다.
소켓에서 사용되는 함수들을 호출하게 되면 그 작업이 끝나기 전까지는 블록킹 상태가 된다.
윈속에서는 이러한 문제를 해결하기 위해서 다양한 종류의 API함수들을 제공하고 있고 추가적으로 Visual C++에서 제공하는 MFC라이브러리에서 제공하는 소켓관련 클래스는 이러한 문제점을 추상화 하고 캡슐화 하고 있기 때문에 쉽게 네트워크 프로그램을 할 수 있게 한다.
----------------------------------------------------------------------------
Winsock관련 클래스

MFC에서는 Winsock에 관련된 많은 API를 추상화한 세가지 소켓관련 클래스를 제공하는데 다음에 나오는
CAsyncSocket, CSocket, CScoketFile클래스가 바로 그런 것이다.
----------------------------------------
CAsyncSocket

CAsyncSocket클래스는 윈도우 소켓을 나타내는데 이는 MFC와 함께 윈도우 소켓을 사용하려는 프로그램머에게 객체지향의 추상화를 제공하도록 윈도우 소켓 API를 캡슐화 한다.
CAsyncSocket클래스를 사용하려면 네트워크 통신에 대해서 어느정도의 지식이 필요하며 개발자는 유니코드와 MBCS(multi byte Character Set)문자열 사이에 블록을 주고 바이트 순서와 변환을 처리하여야 한다. 이 사항에 대한 좀더 자세한 인터페이스는 CSocket클래스를 참고하도록하자.
CAsyncSocket클래스를 사용하기 위해서는 먼저 소켓 핸들을 생성하기 위하여 Create함수를 호출한다.서버 소켓에 대하여는 Listen멤버 함수를 호출하고 클라이언트 소켓에 대하여는 Connect를 멤버 함수를 호출한다. 서버 소켓은 연결 요청을 받을 때는 Accept함수를 호출하여야 한다.
소켓들 사이에서 통신을 하기 위하여 CAsyncSocket클래스의 멤버 함수를 사용한다.
-------------------------------------
CSocket

CSocket은 CAsyncSocket에서 파생되며 윈도우 소켓 API의 캡슐화를 좀더 상위레벨에서 구현한 것이다. 즉 CSocket클래스는 CAsyncSocket클래스보다는 윈도우 소켓 API를 고수준에서 캡슐화 한 것이다.
CSocket은 데이터를 보내고 받는 것을 관리하는 클래스 CSocketFile과 CArchive와 함께 동작한다. 또한 CSocket클래스는 CArchive의 동기화 처리에 필수적인 부분들을 제공한다.
receive.Send,ReceiveFrom,SendTo와 Accept(모두 CAsyncSocket에서 계승)와 같은 함수들은 CSocket에서는 WSAWOUIDBLOCK와 같은 에러를 반환하지 않는다. 그대신에 이 함수들은 처리가 완료될 때 까지 기다린다(즉 Blocking)CSocket클래스를 사용하기 위해서는 먼저 생성자를 호출하고 SOCKET핸들을 생성하기 위해서 Create함수를 호출한다.Create의 디폴트 인자는 스트림 소켓을 생성하지만 CArchive객체와 함께 소켓을 사용하지 않는다면 데이터그램 소켓을 생성하기 위하여 파라메타를 지정하거나 서버 소켓을 생성하기 위해서 특정 포트에 연결할 수도 있다.
클라이언트 측에서는 Connet,서버측에서는 Accept를 사용하여 클라이언트 소켓에 연결한다.
그런다음 CSocketFile 객체를 생성하고 CSocketFile 생성자에 있는 CSocket객체에 붙인다. 그 다음에 데이터를 보내고 받기위해서 CArchive 객체를 생성하고 CArchive생성자에 있는 CSocket객체와 연결한다. 통신이 완료되면 CArchive,CSocketFile과 CSocket객체를 파괴한다.

----------------------------------------------------------
CSocketFile

이 객체는 윈도우 소켓을 사용하여 네트워크에서 데이터를 보내고 받는데 사용되는 CFile클래스와 비슷한 클래스이다.
보통 MFC 직렬화를 사용하여 데이터를 보내고 받는 것처럼 코드를 구현하기 위해서 CSocketFile객체를 CArchive객체와 함께 사용하게 된다. 데이터를 직렬화 하기 위해여 CSocket객체에 데이터를 쓰기 위한 CSocketFile 멈버함수를 호출하여 아카이브 객체에 삽입하면 되는 것이다.
CSocketFile을 사용하는 것 외에도 부모 클래스인 CFile와 같이 CSocketFile클래스를 단독으로 사용할 수도 있다. 아카이브되는 MFC직렬화 함수와 함께 CSocketFile클래스를 사용할 수 있다.CSocketFile클래스는 CFile클래스의 모든 기능을 지원하지는 않기 때문에 몇가지 MFC의 직렬화 함수들은 CSocketFile클래스에서는 사용할 수 없다.

댓글 없음: