본문 바로가기
C & C++/MFC Network

[Web] 인터넷 프로그래밍

by izen8 2011. 4. 25.
반응형

인터넷 프로그래밍

1. 웹 페이지의 소스 보기

1) CInternetSession 클래스

현재 컴퓨터의 파일을 포함하여 웹 사이트에 존재하는 파일에 대한 인터페이스를 제공하는 클래스

 

멤버 함수

CStdioFile* OpenURL(LPCTSTR pstrURL)

pstrURL에 전달된 곳에 연결하고 접속을 시도하고 성공하면 파일에 대한 포인터를 리턴합니다.

URLfile:// 시작하면 CStdioFile *로 사용할 수 있으며 http:// 시작하면 CHttpFile * 타입으로 받을 수 있으며 ftp:// 시작하면 CInternetFile *로 받을 수 있습니다.

 

CHttpConnection* GetHttpConnection(LPCTSTR pstrServer, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL)

 

- CFtpConnection* GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL,

    LPCTSTR pstrPassword = NULL, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,

   BOOL bPassive = FALSE )

 

- void Close( ): 접속 종료

 

2) CHttpFile 클래스

웹 페이지에 접속을 요청하거나 파일을 읽기 위한 기능을 제공하는 클래스

 

멤버 함수

파일의 내용을 저장해주는 멤버 함수

virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax)

virtual BOOL ReadString(CString& rString)

virtual UINT Read(void* lpBuf, UINT nCount):nCount 바이트 만큼 읽기

virtual CString GetFileURL( ) const: 파일의 URL을 리턴

BOOL SetReadBufferSize(UINT nReadSize): 읽기 위한 버퍼 크기 설정

BOOL SetWriteBufferSize(UINT nWriteSize): 쓰기 위한 버퍼 크기 설정

 


예제)에디트에 입력한 웹 주소를 소스와 내용을 볼 수 있고 PC 주소를 입력하면 경로에 해당하는 내용을 CHtmlDialog로 출력하기

1. 대화상자 기반으로 프로젝트 생성

 

2. 대화상자 디자인

 

 

Static 1개 추가

EDIT 2개와 버튼 2개 추가

상단의 EDIT – IDC_URL

하단의 EDIT – Horizontal Scroll, Vertical Scroll, Multiline 속성 True로 설정

              변수 연결: CString – m_Source

 

프로젝트 속성 중에서 [구성 속성] – [일반] - 문자집합 속성을 멀티바이트 문자 집합 사용로 변경
3.
소스 보기 버튼의 BN_CLICKED 메시지 작성

CString url;

TCHAR buffer[1024];

GetDlgItemText(IDC_URL, url);

CInternetSession session;

CHttpFile* pFile = (CHttpFile*)session.OpenURL(url);

if(pFile)

{

        pFile->SetReadBufferSize(1024);

        while(pFile->ReadString(buffer,1024))

        {

               m_Source = m_Source + buffer + _T("\r\n");

        }

}

        pFile->Close();

        UpdateData(FALSE);

 

4. CDHtmlDialog클래스로부터 상속받는 CWebDialog 클래스 추가

대화상자의 Border 속성을 Resizing으로 변경

Maximized Box 속성을 True로 설정

 

5. CWebDialog 클래스에 변수 선언

CString m_str;

 

6. CWebDialog 클래스의 InitDialog 함수에 작성

Navigate(m_str);

 

7. 메인 대화상자의 구현 파일 상단에 인클루드

#include "WebDialog.h"

 

8. 메인 대화상자의 내용보기 버튼의 BN_CLICKED에 작성

CWebDialog dlg;

CString url;

GetDlgItemText(IDC_URL, url);

dlg.m_str = url;

dlg.DoModal();


2. FTP 클라이언트

1) FTP에 사용되는 클래스

CFtpConnection 클래스

FTP 서버와의 연결을 담당하는 클래스

생성자

CFtpConnection(CInternetSession* pSession, LPCTSTR pstrServer,  LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, DWORD_PTR dwContext = 0, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE);

dwContext

INTERNET_STATUS_RESOLVING_NAME

INTERNET_STATUS_NAME_RESOLVED

INTERNET_STATUS_CONNECTING_TO_SERVER

INTERNET_STATUS_CONNECTED_TO_SERVER

INTERNET_STATUS_SENDING_REQUEST

INTERNET_STATUS_ REQUEST_SENT

 

멤버 함수

BOOL CreateDirectory(LPCTSTR pstrDirName ): 디렉토리 생성

 

BOOL GetCurrentDirectory(CString& strDirName ) const: 현재 디렉토리 이름 리턴

 

BOOL GetCurrentDirectory(LPTSTR pstrDirName,LPDWORD lpdwLen) const: 현재 디렉토리 이름 리턴

 

BOOL GetFile(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile,

   BOOL bFailIfExists = TRUE, DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL,

   DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 1 )

pstrRemoteFilepstrLocalFile로 가져오기

 

CInternetFile* OpenFile(LPCTSTR pstrFileName, DWORD dwAccess = GENERIC_READ,

   DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 1 )

pstrFileName을 읽어오기

 

BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile,

DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 1)

pstrLocalFilepstrRemoteFile으로 업로드

BOOL Remove(LPCTSTR pstrFileName)

파일 삭제

 

BOOL RemoveDirectory(LPCTSTR pstrDirName)

디렉토리 삭제

 

BOOL Rename(LPCTSTR pstrExisting, LPCTSTR pstrNew)

pstrExistingpstrNew로 변경

 

BOOL SetCurrentDirectory(LPCTSTR pstrDirName)

pstrDirName로 디렉토리 설정

 

- CFtpFileFind 클래스

파일을 찾아주는 함수

생성자

explicit CFtpFileFind(CFtpConnection* pConnection, DWORD_PTR dwContext = 1)

pConnection으로 생성

 

멤버 함수

virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwFlags = INTERNET_FLAG_RELOAD)

pstrName의 존재 여부를 리턴하는 함수

 

virtual BOOL FindNextFile( )

다음 파일 찾기

 


예제) FTP 클라이언트 프로그램 만들기

1. DialogBased(대화상자 기반)으로 프로젝트 생성(FTPClient)

 

2. 화면 디자인

서버 텍스트 옆의 EDIT ID: IDC_SERVER

익명으로 접속 체크 박스에 변수 연결: BOOLm_bAnonymous

User 텍스트 옆의 EDIT ID: IDC_USER

Password 옆의 EDIT ID: IDC_PASSWORD – Password 속성을 TRUE

경로 옆의 EDIT ID: IDC_PATH – ReadOnly 속성을 TRUE

 

리스트 컨트롤의 ID: IDC_FTPFILELIST

변수 연결CListControl – m_FtpFileList

View 속성 Report, Always Show Selection: TRUE

 

메시지 옆의 EDIT ID: IDC_MESSAGE

라디오 버튼 먼저 그린 라디오 버튼에 Group 속성 TRUE

Binary 버튼의 ID: IDC_RAD_BIN

ASCII 버튼의 ID: IDC_RAD_ASCII

파일 받기 버튼의 아래 EDIT ID: IDC_FILENAME

그 아래 EDIT ID: IDC_PATHNAME

 

3. 다이얼로그 클래스의 헤더파일 상단에 헤더파일 추가

#include "afxinet.h"

 

4. 다이얼로그 클래스에 변수 선언(접속과 관련된 변수)

CInternetSession m_Session;

CFtpConnection* m_pFtpConn;

 

5. 다이얼로그 클래스의 OnInitDialog 함수에서 컨트롤 초기화하는 코드 작성

m_FtpFileList.InsertColumn(0, _T("파일명"), LVCFMT_LEFT, 200, -1);

m_FtpFileList.InsertColumn(1, _T("형식"), LVCFMT_LEFT, 80, -1);

m_FtpFileList.InsertColumn(2, _T("URL"), LVCFMT_LEFT, 300, -1);

SetDlgItemText(IDC_MESSAGE, _T("접속대기중"));

((CButton*)GetDlgItem(IDC_RAD_BIN))->SetCheck(BST_CHECKED);

 

6. 대화상자의 IDC_CHECK1 BN_CLICKED 메시지 작성

UpdateData();

        CEdit *pEdit1 = (CEdit *)GetDlgItem(IDC_USER);

        CEdit *pEdit2 = (CEdit *)GetDlgItem(IDC_PASSWORD);

        if(m_bAnonymous)

        {

               pEdit1->SetWindowText(_T(""));

               pEdit2->SetWindowText(_T(""));

               pEdit1->EnableWindow(FALSE);

               pEdit2->EnableWindow(FALSE);

        }

        else

        {

               pEdit1->EnableWindow();

               pEdit2->EnableWindow();

        }

7. 접속 버튼의 BN_CLICKED 메시지 작성

        CString host;

        CString dir;

        CString user;

        CString password;

        GetDlgItemText(IDC_SERVER, host);

        GetDlgItemText(IDC_USER, user);

        GetDlgItemText(IDC_PASSWORD, password);

        if(host.IsEmpty())

        {

               AfxMessageBox(_T("서버정보를입력하세요."));

               return;

        }

        if(!m_bAnonymous)

        {

               if(user.IsEmpty())

               {

                       AfxMessageBox(_T("User 정보를입력하세요."));

                       return;

               }

               m_pFtpConn = m_Session.GetFtpConnection(host, user, password);

        }

        else

               m_pFtpConn = m_Session.GetFtpConnection(host);

        if(m_pFtpConn == NULL)

        {

               AfxMessageBox(_T("서버접속실패"));

               return;

        }

       

        dir = "/";

        FindFtpFile(dir);

        SetDlgItemText(IDC_PATH, dir);


8. 파일을 찾아서 표시해 주는 FindFtpFile 함수 작성

void CFTPClientDlg::FindFtpFile(CString dir)

{

CString msg;

        BOOL isFound;

        int index = 0;

        CString type;

        CString url;

        CFtpFileFind finder(m_pFtpConn);

        isFound = finder.FindFile(dir);

        m_FtpFileList.DeleteAllItems();

        SetDlgItemText(IDC_MESSAGE, _T("파일검색중..."));

        while (isFound)

        {

               isFound = finder.FindNextFile();

               m_FtpFileList.InsertItem(LVIF_TEXT|LVIF_STATE, index, finder.GetFileName(), 0, LVIS_SELECTED, 0, 0);

               if(finder.IsDirectory() == TRUE)

               {

                       type = "폴더";

               }

               else

               {

                       type = "파일";

               }

               m_FtpFileList.SetItemText(index, 1, type);

               m_FtpFileList.SetItemText(index++, 2, finder.GetFileURL());

        }

        SetDlgItemText(IDC_MESSAGE, _T("검색완료."));

}


9. 리스트 컨트롤의 더블 클릭(NM_DBLCLK) 이벤트 작성

CString path;

        int item;

        int index = 0;

        CString FileName;

        CString Type;

        GetDlgItemText(IDC_PATH, path);

        POSITION pos = m_FtpFileList.GetFirstSelectedItemPosition();

        item = m_FtpFileList.GetNextSelectedItem(pos);

        FileName = m_FtpFileList.GetItemText(item, 0);

        Type = m_FtpFileList.GetItemText(item, 1);

        if(Type != "폴더")

        {

               AfxMessageBox(_T("폴더가아닙니다"));

               return;

        }

        path = path + FileName + _T('/');

        CString type;

        m_pFtpConn->SetCurrentDirectory(path);

        m_FtpFileList.DeleteAllItems();

        CFtpFileFind finder(m_pFtpConn);

        BOOL isFound = finder.FindFile(path);

        if(isFound == TRUE)

        m_FtpFileList.DeleteAllItems();

        SetDlgItemText(IDC_MESSAGE,_T("파일검색중..."));

        while (isFound)

        {

               isFound = finder.FindNextFile();

               m_FtpFileList.InsertItem(LVIF_TEXT|LVIF_STATE, index, finder.GetFileName(), 0, LVIS_SELECTED, 0, 0);

              

               if(finder.IsDirectory() == TRUE)

               {

                       type = "폴더";

               }

               else

               {

                       type = "파일";

               }

               m_FtpFileList.SetItemText(index, 1, type);

               m_FtpFileList.SetItemText(index++, 2, finder.GetFileURL());

 

        }

        SetDlgItemText(IDC_MESSAGE, _T("검색완료."));

        SetDlgItemText(IDC_PATH, path);

        *pResult = 0;

 

10. 접속 종료 버튼의 BN_CLIEKED 메시지 작성

if(m_pFtpConn != NULL)

        {

               m_pFtpConn->Close();

        }

        SetDlgItemText(IDC_MESSAGE, _T("접속종료."));

 


11. 파일 받기 버튼의 BN_CLIEKED 메시지 작성

CString path, target;

        int     item;

        CString filename;

        CString type;

        DWORD   mode;

 

        if(m_pFtpConn == NULL)

        {

               AfxMessageBox(_T("서버에접속되지않았습니다."));

               return;

        }

        GetDlgItemText(IDC_PATH, path);

        POSITION pos = m_FtpFileList.GetFirstSelectedItemPosition();

        item = m_FtpFileList.GetNextSelectedItem(pos);

        filename = m_FtpFileList.GetItemText(item, 0);

        type = m_FtpFileList.GetItemText(item, 1);

        if(type == "폴더")

                return;

        path = path + filename;

        target = _T("C:\\Temp\\") + filename;

        if(((CButton*)GetDlgItem(IDC_RAD_BIN))->GetCheck() == BST_CHECKED)

               mode = FTP_TRANSFER_TYPE_BINARY;

        else

               mode = FTP_TRANSFER_TYPE_ASCII;

        m_pFtpConn->GetFile(path, target, TRUE, FILE_ATTRIBUTE_NORMAL, mode, 1);


12. 파일 선택 버튼의 BN_CLICKED 메시지 작성

CFileDialog dlg(TRUE);

        if(dlg.DoModal() == IDOK)

        {

               SetDlgItemText(IDC_FILENAME, dlg.GetFileName());

               SetDlgItemText(IDC_PATHNAME, dlg.GetPathName());

        }

 

13. 파일 보내기 버튼의 BN_CLICKED 메시지 작성

CString path, target;

        CString filename, pathname;

        DWORD   mode;

        if(m_pFtpConn == NULL)

        {

               AfxMessageBox(_T("서버에접속되지않았습니다."));

               return;

        }

        GetDlgItemText(IDC_PATH, path);

        GetDlgItemText(IDC_FILENAME, filename);

        GetDlgItemText(IDC_PATHNAME, pathname);

        target = path + filename;

        if(((CButton*)GetDlgItem(IDC_RAD_BIN))->GetCheck() == BST_CHECKED)

        {

               mode = FTP_TRANSFER_TYPE_BINARY;

        }

        else

        {

               mode = FTP_TRANSFER_TYPE_ASCII;

        }

        m_pFtpConn->PutFile(pathname, target, mode, 1);

        FindFtpFile(path);

반응형

댓글