인터넷 프로그래밍
1. 웹 페이지의 소스 보기
1) CInternetSession 클래스
현재 컴퓨터의 파일을 포함하여 웹 사이트에 존재하는 파일에 대한 인터페이스를 제공하는 클래스
멤버 함수
CStdioFile* OpenURL(LPCTSTR pstrURL)
pstrURL에 전달된 곳에 연결하고 접속을 시도하고 성공하면 파일에 대한 포인터를 리턴합니다.
URL이 file://로 시작하면 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 )
pstrRemoteFile을 pstrLocalFile로 가져오기
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)
pstrLocalFile을 pstrRemoteFile으로 업로드
BOOL Remove(LPCTSTR pstrFileName)
파일 삭제
BOOL RemoveDirectory(LPCTSTR pstrDirName)
디렉토리 삭제
BOOL Rename(LPCTSTR pstrExisting, LPCTSTR pstrNew)
pstrExisting을 pstrNew로 변경
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
익명으로 접속 체크 박스에 변수 연결: BOOL형 m_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);
'C & C++ > MFC Network' 카테고리의 다른 글
[Web] 인터넷 연결여부 확인 (0) | 2011.05.25 |
---|---|
[Web] 소켓 프로그래밍 (0) | 2011.04.25 |
[MFC] HTTP 소켓 통신 (0) | 2011.04.23 |
[IP] Lan Card 정보 추출 (0) | 2011.04.18 |
[IP] IE BHO 전용 브라우져 시 새창 띄울때 IE모양 바꾸기~ (0) | 2011.04.18 |
댓글