본문 바로가기

기술자료/CPP

[강좌] 파일전송 전용 확장 DLL 을 만들자! -> 첫번째 이야기

안녕하세요?

며칠의 시간이 흘렀네요...
이제 강좌를 시작합니다..^^

원래 계획대로라면 개발완료루 테스트 거쳐서 웬만한 버그 수정까지
다한후 할려고 했는데...시간이 넘 오래걸리는거 같아서
개발과 같이 강좌할려고 합니다 ^^

내용중에 잘못된 사항이 있을 수 있음을 미리 알려드리며 ㅡ_ㅡ;
잘못된 내용이 있다면 지적해주시기 바랍니다.

우선 오늘은 처음 초기화부분에
대해서 강좌 하겠습니다.

음 본론으로 들어가서...

파일 송수신에 대해서 간단하게 정리를 하자면 다음과 같습니다.

보내는 쪽--------------------
파일 오픈 - 파일정보 전송 - 일정단위의 패킷을 계속 읽어서 전송 - 파일 닫음

받는 쪽 --------------------
파일 오픈 - 파일정보 수신 - 일정단위 패킷을 계속 Write - 파일 닫음

간단하죠?
흑 사실 말이야 간단하지 막상하다보면 짜증난답니다 ㅡㅡ;

또한 가장중요한 것은 파일 송신하고 수신하는 부분은 어플과 같은 스레드에 두어서는
안된다는 것입니다. 그렇게 되면 파일전송하는 동안 마치 어플이 다운된거 처럼
보이게 되죠...아무런 이벤트도 먹질 않죠...이벤트가 안먹는다는것은?
전송도중 취소를 할수 없다는 뜻이죠 ㅡㅡ;

자 그럼 프로젝트를 시작해봅시다.

먼저 Visual C++을 띄우고..........................

Project에서 MFC AppWizard (dll) 을 선택한후 프로젝트 이름을 입력하고 다음...
확장DLL 로 할것이므로...MFC Extension DLL (using shared MFC DLL) 이것을 선택합니다.
Windows Socket도 체크를 해야겠죠...

Finish 버튼을 눌러 완료합니다.

App 클래스 딸랑 하나있죠?

이제 본격적으로 클래스를 추가해서 작업을 해야합니다.

자...CTransfer 라는 이름의 Generic 클래스를 하나 만듭시다.
상속 클래스는 없습니다.

헤더파일을 보면

class CTransfer  
{
public:
    CTransfer();
    virtual ~CTransfer();
};

이렇게 나오죠?
확장 DLL의 이 클래스를 외부 App에서 이용하기 위해서는 약간의 수정을 해야합니다.

class AFX_EXT_CLASS CTransfer  
{
public:
    CTransfer();
    virtual ~CTransfer();
};

이렇게 고칩니다.

우리는 이제 앞으로 이 DLL 을 이용할때 단지 CTransfer 라는 클래스만 이용해서
파일전송을 하면 됩니다. 그렇다면 CTransfer 라는 클래스에 모든 기능을 다 집어넣어야겠죠..

이제 메인 클래스를 만들었으니, 관련된 소켓, 스레드 클래스를 한번 만들어보겠습니다.

CListen 이라는 이름의 CAsyncSocket 을 상속받아서 클래스를 만듭니다.
CActive 라는 이름의 CSocket 을 상속받아서 클래스를 만듭니다.
CClientThread 라는 이름의 CWinThread 를 상속받아서 클래스를 만듭니다.

CTransfer 클래스에서 소켓을 Listen 시키기 위해 관련된 함수를 추가합니다.
소스는 다음과 같습니다.

Transfer.h ----

#include "Listen.h"

class AFX_EXT_CLASS CTransfer  
{
public:
    CTransfer();
    virtual ~CTransfer();
public:
    CListen* m_pListen;
    void Listen();
};

Transfer.cpp ----

CTransfer::CTransfer()
{

}

CTransfer::~CTransfer()
{
    delete m_pListen;
    m_pListen = NULL;
}

void CTransfer::Listen()
{
    m_pListen = new CListen;
    m_pListen->Create(3500); // 포트번호는 임의로 결정하세요.
    m_pListen->Listen();
}

자 초기화 부분은 끝났습니다.

이어서 이어지는 강좌는 클라이언트가 접속할때 스레드를 생성하고 관리부분에 대해서
추가하겠습니다.