MFC :: Chapter 14 (FTP 프로그래밍) - 109번째 이야기
FTP 클라이언트 프로그램의 개요
현재 인터넷이라고 말한다면, 일반적인 사람들은 웹 브라우저(네스케이브, 익스플로러)를 통해 인터넷 사이트에 접속하는 것이라고 쉽게 말할 것이다. 그 이유는 인터넷의 일부분인 HTTP 부분이 많은 성장을 하였고 또한 이미지나 사운드 등의 멀티미디어적인 요소들이 포함되어 있기 때문이다. 하지만 인터넷을 구성하는 것들은 이것만 있는 것이 아니라 HTTP, FTP, Gopher 등 여러가지가 존재한다.
FTP는 File Transfer Protocol의 약어로서 인터넷상의 파일 전송의 기본이 되는 통신 규약이다. 웹 브라우저를 통해서 파일을 다운 받거나 업로드 하는 것은 FTP를 근간으로 삼고 있다고 할 수 있다.
우리는 FTP 클라이언트 프로그램을 제작하기 위해 몇 가지 MFC 클래스들을 사용할 것이다. 우선 인터넷의 연결을 위한 CInternetSession 클래스를 이용할 것이며, FTP 접속을 위해 CFtpConnection 클래스를, 서버의 파일과 디렉터리를 읽기 위해 CFtpFileFind 클래스를 사용할 것이다.
1) CInternetSession 클래스
이 클래스를 제작하려는 응용 프로그램에서 인터넷에 연결하기 위한 연결 통로 역할을 하는 클래스이다. MFC에서 CInternetSession 클래스는 다음과 같은 계층 구조를 가지고 있다.
MFC 개발자가 어떤 특정 인터넷 서비스에 접속하려면 CInternetSession 클래스를 통해서 인터넷에 대한 세션을 구성해야 한다. 물론 뛰어난 개발자라면 이런 세션 클래스를 직접 만들 수도 있지만 기본적으로 MFC에서 제공하는 CInternetSession 클래스를 이용한다. 예를 들어 FTP 서버에 접속하기 위해서는 이 클래스의 멤버 함수로서 GetFtpConnection() 함수를 이용하여 FTP(File Transfer Protocol) 서비스에 대한 연결 세션을 가져오게 된다. 또한 Hyper-Text Transfer Protocol 즉, 웹(Web)에 접속하기 위해서는 GetHttpConnection() 함수를 사용하여 HTTP에 대한 연결 세션을 가져와야 한다.
2) CFtpConnection 클래스
위에서 설명한 CInternetSession 클래스를 통해 인터넷에 대한 세션을 구성했다. 그러면 우리가 작성하고자 하는 FTP 클라이언트 프로그램에서 서버와의 연결과 FTP 명령을 처리해 주는 클래스가 필요하다. 이 클래스가 CFtpConnection 클래스이다. CFtpConnection 클래스는 CInternetSession 클래스를 기저 클래스로 하고 있다. (위 그림 참조)
우선 FTP에 대한 연결을 만들기 위해서는 CInternetSession 클래스의 멤버 함수 GetFtpConnection() 함수의 포인터 반환 값을 통해서 CFtpConnection 클래스의 객체를 생성하여야 한다는 것을 명심해야 한다. 이 때 Ftp 서버에 대한 계정 및 비밀번호를 입력하게 된다.
이 FtpConnection 클래스는 Ftp에서 사용하는 기본적인 명령어들을 멤버 함수로 정의해 놓았다. 파일을 업로드하거나 다운로드하는 함수도 이 클래스가 담당하고 있다. 업로드 하기 위해서는 PutFile()이라는 함수를 사용하고, 다운로드를 위해서는 GetFile() 함수를 사용한다. 이 외에 파일/폴더 삭제, 이름 변경에 대한 함수들도 존재한다.
3) CFtpFileFind 클래스
CFtpFileFind 클래스는 인터넷상의 Ftp 서버의 파일을 검색하는 클래스이다. 이 클래스는 파일의 검색, 파일의 URL 상의 위치 및 기타 파일들의 정보를 가져오는 멤버 함수들을 가지고 있다. CFtpFileFind 클래스는 CFileFind 클래스로 부터 상속받아졌으며(위 그림 참조) CFileFind 클래스는 로컬 시스템에서 사용되는 클래스이다.
SetCursor() 함수
SetCursor() 함수는 새로운 커서로 설정하기 위해 호출하는 함수로 원형은 다음과 같다.
HCURSOR SetCursor(HCURSOR hCursor);
( hCursor : 커서의 핸들 )
CFtpConnection::GetFtpConnection() 함수
GetFtpConnection() 함수는 FTP 서버와 연결하고 CFtpConnection 객체에 대한 포인터를 반환하는 함수로 원형은 다음과 같다.
CFtpConnection* GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE);
Throw ( CInternetException);
( pstrServer : FTP 서버 이름을 포함하는 문자열 포인터
pstrUserName : 로그인하기 위한 사용자의 이름을 명시하는 문자열 포인터
pstrPassword : 로그인하기 위한 패스워드를 명시하는 문자열 포인터
nPort : 서버로 사용하기 위한 TCP/IP의 ID
nPassive : FTP 세션을 위해 활성 모드를 명시 )
CInternetException::GetErrorMessage() 함수
GetErrorMessage() 함수는 발생되는 에러에 대한 텍스트를 제공하기 위해 호출하는 함수이다. 원형은 다음과 같다.
virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
( lpszError : 에러 메시지를 받을 버퍼의 포인터
nMaxError : 버퍼가 수용할 수 있는 문자의 최대 수
pnHelpContext : 도움말 구문 ID를 받을 수 있는 UINT의 주소 )
CFtpConnection::GetCurrentDirectory() 함수
GetCurrentDirectory() 함수는 현재 디렉터리의 이름을 가져오기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL GetCurrentDirectory(CString& strDirName) const;
BOOL GetCurrentDirectory(LPTSTR pstrDirName, LPDWORD lpdwLen) const;
( strDirName : 디렉터리 이름을 받을 문자열의 참조
pstrDirName : 디렉터리의 이름을 받을 문자열의 포인터
lpdwLen : DWORD 포인터 )
CFtpFileFind::FindFile() 함수
FindFile() 함수는 FTP 파일을 찾기 위해 호출하는 멤버 함수이다. 원형은 다음과 같다.
virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwFlags = INTERNET_FLAG_RELOAD);
( pstrName : 찾고자 하는 파일의 이름을 포함하는 문자열 포인터
dwFlags : 세션을 핸들하기 위한 방법을 묘사하는 플래그 )
CFtpFileFind::FindNextFile() 함수
FindNextFile() 함수는 FindFile() 멤버 함수를 호출해서 파일 탐색 시작을 연결하기 위해 호출하는 함수이다. 원형은 다음과 같다.
virtual BOOL FindNextFile();
CFtpFileFind::GetFileName() 함수
GetFileName() 함수는 찾은 파일 이름을 가져오기 위해 호출되는 함수이다. GetFileName() 함수를 호출하기 전에 적어도 한번은 FindNextFile() 하수를 호출해야 한다. 이 함수의 원형은 다음과 같다.
virtual CString GetFileName() const;
CFtpFileFind::GetLastWriteTime() 함수
GetLastWriteTime() 함수는 변경된 마지막 번째 파일을 가져오기 위해 호출되는 함수로 원형은 다음과 같다.
virtual BOOL GetLastWriteTime(FILETIME* pFileTime) const;
virtual BOOL GetLastWriteTime(CTime& refTime) const;
( pFileTime : 마지막으로 쓰인 파일을 포함하는 FILETIME 구조체 포인터
refTime : CTime 객체이기 위한 참조형 )
CFtpFileFind::IsDirectory() 함수
IsDirectory() 함수는 찾은 파일이 디렉터리인지를 결정하기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL IsDirectory() const;
CFtpConnection::SetCurrentDirectory() 함수
SetCurrentDirectory() 함수는 FTP 서버에서 다른 디렉터리로 변경하기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL SetCurrentDirectory(LPCTSTR pstrDirName);
( pstrDirName : 디렉터리의 이름을 포함하는 문자열 포인터 )
CFtpConnection::PutFile() 함수
PutFile() 함수는 FTP 서버에 파일을 업로드 하기 위한 함수이다. 원형은 다음과 같다.
BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1);
( pstrLocalFile : 로컬 시스템으로 보낼 파일의 이름을 포함하는 문자열 포인터
pstrRemoteFile : FTP 서버에 생성할 파일의 이름을 포함하는 문자열 포인터
dwFlags : 발생한 파일의 전송 조건을 명시
dwContext : 파일 공간을 위한 ID )
CFtpConnection::GetFile() 함수
GetFile() 함수는 로컬 장치에 파일을 저장하고 FTP 서버로부터 파일을 얻기 위해 호출되는 함수이다. 원형은 다음과 같다.
BOOL GetFile(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile, BOOL bFailIfExists = TRUE, DWORD dwAttributes = FILE_ATTRIBUTE_NOMAL, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1);
( pstrRemoteFile : FTP 서버로부터 회수하기 위해 파일이름을 포함하는 문자열 포인터
pstrLocalFile : 로컬 시스템에 생성하기 위해 파일이름을 포함하는 문자열 포인터
bFailIfExists : 기존 파일에 의해 이미 사용된 파일인지의 여부를 표시
dwAttributes : 파일 속성을 표시
dwFlags : 전송에 의해 발생할 조건을 명시
dwContext : 반복할 파일 ID )
현재 인터넷이라고 말한다면, 일반적인 사람들은 웹 브라우저(네스케이브, 익스플로러)를 통해 인터넷 사이트에 접속하는 것이라고 쉽게 말할 것이다. 그 이유는 인터넷의 일부분인 HTTP 부분이 많은 성장을 하였고 또한 이미지나 사운드 등의 멀티미디어적인 요소들이 포함되어 있기 때문이다. 하지만 인터넷을 구성하는 것들은 이것만 있는 것이 아니라 HTTP, FTP, Gopher 등 여러가지가 존재한다.
FTP는 File Transfer Protocol의 약어로서 인터넷상의 파일 전송의 기본이 되는 통신 규약이다. 웹 브라우저를 통해서 파일을 다운 받거나 업로드 하는 것은 FTP를 근간으로 삼고 있다고 할 수 있다.
우리는 FTP 클라이언트 프로그램을 제작하기 위해 몇 가지 MFC 클래스들을 사용할 것이다. 우선 인터넷의 연결을 위한 CInternetSession 클래스를 이용할 것이며, FTP 접속을 위해 CFtpConnection 클래스를, 서버의 파일과 디렉터리를 읽기 위해 CFtpFileFind 클래스를 사용할 것이다.
1) CInternetSession 클래스
이 클래스를 제작하려는 응용 프로그램에서 인터넷에 연결하기 위한 연결 통로 역할을 하는 클래스이다. MFC에서 CInternetSession 클래스는 다음과 같은 계층 구조를 가지고 있다.
MFC 개발자가 어떤 특정 인터넷 서비스에 접속하려면 CInternetSession 클래스를 통해서 인터넷에 대한 세션을 구성해야 한다. 물론 뛰어난 개발자라면 이런 세션 클래스를 직접 만들 수도 있지만 기본적으로 MFC에서 제공하는 CInternetSession 클래스를 이용한다. 예를 들어 FTP 서버에 접속하기 위해서는 이 클래스의 멤버 함수로서 GetFtpConnection() 함수를 이용하여 FTP(File Transfer Protocol) 서비스에 대한 연결 세션을 가져오게 된다. 또한 Hyper-Text Transfer Protocol 즉, 웹(Web)에 접속하기 위해서는 GetHttpConnection() 함수를 사용하여 HTTP에 대한 연결 세션을 가져와야 한다.
2) CFtpConnection 클래스
위에서 설명한 CInternetSession 클래스를 통해 인터넷에 대한 세션을 구성했다. 그러면 우리가 작성하고자 하는 FTP 클라이언트 프로그램에서 서버와의 연결과 FTP 명령을 처리해 주는 클래스가 필요하다. 이 클래스가 CFtpConnection 클래스이다. CFtpConnection 클래스는 CInternetSession 클래스를 기저 클래스로 하고 있다. (위 그림 참조)
우선 FTP에 대한 연결을 만들기 위해서는 CInternetSession 클래스의 멤버 함수 GetFtpConnection() 함수의 포인터 반환 값을 통해서 CFtpConnection 클래스의 객체를 생성하여야 한다는 것을 명심해야 한다. 이 때 Ftp 서버에 대한 계정 및 비밀번호를 입력하게 된다.
이 FtpConnection 클래스는 Ftp에서 사용하는 기본적인 명령어들을 멤버 함수로 정의해 놓았다. 파일을 업로드하거나 다운로드하는 함수도 이 클래스가 담당하고 있다. 업로드 하기 위해서는 PutFile()이라는 함수를 사용하고, 다운로드를 위해서는 GetFile() 함수를 사용한다. 이 외에 파일/폴더 삭제, 이름 변경에 대한 함수들도 존재한다.
3) CFtpFileFind 클래스
CFtpFileFind 클래스는 인터넷상의 Ftp 서버의 파일을 검색하는 클래스이다. 이 클래스는 파일의 검색, 파일의 URL 상의 위치 및 기타 파일들의 정보를 가져오는 멤버 함수들을 가지고 있다. CFtpFileFind 클래스는 CFileFind 클래스로 부터 상속받아졌으며(위 그림 참조) CFileFind 클래스는 로컬 시스템에서 사용되는 클래스이다.
SetCursor() 함수
SetCursor() 함수는 새로운 커서로 설정하기 위해 호출하는 함수로 원형은 다음과 같다.
HCURSOR SetCursor(HCURSOR hCursor);
( hCursor : 커서의 핸들 )
CFtpConnection::GetFtpConnection() 함수
GetFtpConnection() 함수는 FTP 서버와 연결하고 CFtpConnection 객체에 대한 포인터를 반환하는 함수로 원형은 다음과 같다.
CFtpConnection* GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE);
Throw ( CInternetException);
( pstrServer : FTP 서버 이름을 포함하는 문자열 포인터
pstrUserName : 로그인하기 위한 사용자의 이름을 명시하는 문자열 포인터
pstrPassword : 로그인하기 위한 패스워드를 명시하는 문자열 포인터
nPort : 서버로 사용하기 위한 TCP/IP의 ID
nPassive : FTP 세션을 위해 활성 모드를 명시 )
CInternetException::GetErrorMessage() 함수
GetErrorMessage() 함수는 발생되는 에러에 대한 텍스트를 제공하기 위해 호출하는 함수이다. 원형은 다음과 같다.
virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
( lpszError : 에러 메시지를 받을 버퍼의 포인터
nMaxError : 버퍼가 수용할 수 있는 문자의 최대 수
pnHelpContext : 도움말 구문 ID를 받을 수 있는 UINT의 주소 )
CFtpConnection::GetCurrentDirectory() 함수
GetCurrentDirectory() 함수는 현재 디렉터리의 이름을 가져오기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL GetCurrentDirectory(CString& strDirName) const;
BOOL GetCurrentDirectory(LPTSTR pstrDirName, LPDWORD lpdwLen) const;
( strDirName : 디렉터리 이름을 받을 문자열의 참조
pstrDirName : 디렉터리의 이름을 받을 문자열의 포인터
lpdwLen : DWORD 포인터 )
CFtpFileFind::FindFile() 함수
FindFile() 함수는 FTP 파일을 찾기 위해 호출하는 멤버 함수이다. 원형은 다음과 같다.
virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwFlags = INTERNET_FLAG_RELOAD);
( pstrName : 찾고자 하는 파일의 이름을 포함하는 문자열 포인터
dwFlags : 세션을 핸들하기 위한 방법을 묘사하는 플래그 )
CFtpFileFind::FindNextFile() 함수
FindNextFile() 함수는 FindFile() 멤버 함수를 호출해서 파일 탐색 시작을 연결하기 위해 호출하는 함수이다. 원형은 다음과 같다.
virtual BOOL FindNextFile();
CFtpFileFind::GetFileName() 함수
GetFileName() 함수는 찾은 파일 이름을 가져오기 위해 호출되는 함수이다. GetFileName() 함수를 호출하기 전에 적어도 한번은 FindNextFile() 하수를 호출해야 한다. 이 함수의 원형은 다음과 같다.
virtual CString GetFileName() const;
CFtpFileFind::GetLastWriteTime() 함수
GetLastWriteTime() 함수는 변경된 마지막 번째 파일을 가져오기 위해 호출되는 함수로 원형은 다음과 같다.
virtual BOOL GetLastWriteTime(FILETIME* pFileTime) const;
virtual BOOL GetLastWriteTime(CTime& refTime) const;
( pFileTime : 마지막으로 쓰인 파일을 포함하는 FILETIME 구조체 포인터
refTime : CTime 객체이기 위한 참조형 )
CFtpFileFind::IsDirectory() 함수
IsDirectory() 함수는 찾은 파일이 디렉터리인지를 결정하기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL IsDirectory() const;
CFtpConnection::SetCurrentDirectory() 함수
SetCurrentDirectory() 함수는 FTP 서버에서 다른 디렉터리로 변경하기 위해 호출되는 함수로 원형은 다음과 같다.
BOOL SetCurrentDirectory(LPCTSTR pstrDirName);
( pstrDirName : 디렉터리의 이름을 포함하는 문자열 포인터 )
CFtpConnection::PutFile() 함수
PutFile() 함수는 FTP 서버에 파일을 업로드 하기 위한 함수이다. 원형은 다음과 같다.
BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1);
( pstrLocalFile : 로컬 시스템으로 보낼 파일의 이름을 포함하는 문자열 포인터
pstrRemoteFile : FTP 서버에 생성할 파일의 이름을 포함하는 문자열 포인터
dwFlags : 발생한 파일의 전송 조건을 명시
dwContext : 파일 공간을 위한 ID )
CFtpConnection::GetFile() 함수
GetFile() 함수는 로컬 장치에 파일을 저장하고 FTP 서버로부터 파일을 얻기 위해 호출되는 함수이다. 원형은 다음과 같다.
BOOL GetFile(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile, BOOL bFailIfExists = TRUE, DWORD dwAttributes = FILE_ATTRIBUTE_NOMAL, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = 1);
( pstrRemoteFile : FTP 서버로부터 회수하기 위해 파일이름을 포함하는 문자열 포인터
pstrLocalFile : 로컬 시스템에 생성하기 위해 파일이름을 포함하는 문자열 포인터
bFailIfExists : 기존 파일에 의해 이미 사용된 파일인지의 여부를 표시
dwAttributes : 파일 속성을 표시
dwFlags : 전송에 의해 발생할 조건을 명시
dwContext : 반복할 파일 ID )



Practice14_1.rar
댓글을 달아 주세요.
아~ 네~
여기 댓글 입니다. 받으셈~ // 220.95.164.***
댓글 잘 받았습니다 ㅋㅋ // 210.99.137.***
좋은 자료가 될 것 같아 퍼갑니다~ ~
감사합니다 ~ ~ // 59.31.125.***
좋은 자료가 되셨다니 다행이네요
방문해주셔서 감사합니다 :-) // 121.140.62.***
안녕하세요 MFC 를 공부하고 있는 학생입니다.
먼저 좋은자료 감사합니다.
FTP 프로그램을 짜려고 하는데 많은 도움이 되었네요.^^
님의 프로그램을보고 질문있어서 이렇게 올립니다.
CFtpConnection 클래스로 FTP 를 구현하면
전송률 같은건 구현 못하나요?
만약 못한다면 구현 할 수 있는 다른 클래스가 있는지요?
답변 부탁드립니다.^^; // 124.60.187.***
전송률을 구현해주는 라이브러리가 있는지는 잘 모르겠고요
직접 구하셔야 할 듯 합니다
업로드건 다운로드건 사용자가 버튼을 누를경우
선택된 파일들의 총 용량과 개별 파일 전송 후의 전송 용량을 이용해
백분율로 정규화하여 프로그레스바 컨트롤을 이용해 뿌려주면 될 것 같습니다 // 121.140.62.***