Ниже представлено консольное приложение, демонстрирующие работу простого FTP-клиента. При запуске программа спрашивает имя сервера FTP. В той же строке через пробел можно набрать имя и пароль. Программа осуществляет всего четыре команды: dir - просмотр текущего каталога, cd - переход к указаному каталогу, copy - копирование файла на логическиё диск, help или ? - вывод помощи. Разроботав данный пример, вы легко сможете усовершенствовать его и создать полноценного клиента для FTP - сервера. #include "stdafx.h" #include "FTP1.h" #include <afxinet.h> #ifdef _DEBUG #define new DEBUG_NEW #endif
CWinApp theApp; using namespace std; void getcs(CString *,HANDLE); BOOL ctrlc(DWORD); int main(int argc, char* argv[], char* envp[]) { int i; CString ins=NULL, name=NULL, parol=NULL; CString ts1,ts2; AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); //работаем в новой консоли FreeConsole(); AllocConsole(); HANDLE h1 = GetStdHandle(STD_INPUT_HANDLE); HANDLE h2 = GetStdHandle(STD_OUTPUT_HANDLE); //определить обработчик событий SetConsoleCtrlHandler((PHANDLER_ROUTINE)ctrlc, true); //заголовок консоли SetConsoleTitle("FTP"); printf("Host:"); //здесь мы вводим имя сервера, имя, нароль getcs(&ins,h1); //разбор строки ins.Trim(); if((i=ins.Find(" "))!=-1) { name=ins.Mid(i).Trim(); ins=ins.Left(i); if((i=name.Find(" "))!=-1) { parol=name.Mid(i).Trim(); name=name.Left(i); } } //конец разбора строки //интернет-объекты CInternetSession ses; CFtpConnection* con = NULL; CFtpFileFind *finder; try { //осуществить соединение с FTP-сервером con=ses.GetFtpConnection(ins,name,parol); //если соединение не удалось то следующие строки выпосняться не будут printf("Connection, Ok!\n"); //получить текущий каталог con->GetCurrentDirectory(ins); printf("Current Directory: %s\n",ins); //создать объект для поиска файлов на FTP finder = new CFtpFileFind(con); } catch(CInternetException *pe) { con=NULL; pe->Delete(); printf("No connection!\n"); Sleep(2000); return 1; } do { //ввод команды нашего клиента FTP getcs(&ins,h1); ins.Trim(); ins.MakeLower(); //просмотр каталога if(ins.Left(3)=="dir") { //просматриваем все файлы BOOL h = finder->FindFile(_T("*")); while(h) { h = finder->FindNextFile(); printf("%s\n",(LPCTSTR) finder->GetFileURL()); } continue; } //смена каталога if(ins.Left(3)=="cd ") { ts1=ins.Mid(3).Trim(); con->SetCurrentDirectory(ts1); con->SetCurrentDirectory(ins); printf("Current Directory: %s\n",ins); continue; } //копирование файла if(ins.Left(5)=="copy ") { //разбор параметров ts1=ins.Mid(5).Trim(); if((i=ts1.Find(" "))==-1) continue; ts2=ts1.Mid(i).Trim(); ts1=ts1.Left(i); //копирование con->GetFile(ts1,ts2); continue; } //вывод помощи if(ins=="help"||ins=="?") { printf("Commands:\nhelp\ndir\ncd\ncopy\n"); } } while(ins!="exit"); printf("Bu-By!\n"); Sleep(2000); con->Close(); return 0; } //функция ввода строки void getcs(CString *cs,HANDLE h) { char s[200]; gets(s); *cs=s; }; //функция перехвата событий BOOL ctrlc(DWORD pr) { return true; }; Теперь дадим пояснения к программе. Ключевым моментом функционирования являются строки: CInternetSession ses; CFtpConnection* con = NULL; CFtpFileFind *finder; Сбъект ses определяет сеанс между данной программой и сервером FTP. Связь же объекта *con с сервером FTP и одновременно его создание наступают в строку: con=ses.GetFtpConnection(ins,name,parol); Связывание объекта finder с сервером FTP и его создание происходит в строке: finder = new CFtpFileFind(con); Мы видим на данном примере, что все замыкается на объекте ses, который определяет сеанс. Ещё одну вещь не стоит забывать, когда имеете дело с FTP-сервером. Работа клиента в действительности заключается в передаче комант FTP-серверу. Сервер имеет некий набор команд. Когда мы выполняем, скажем, метод con->SetCurrentDirectory, то серверу FTP передаётся некая команда(или последовательность команд), которую он и выполняет. Расширить возможности нашей прграммы можно использовав команды FTP. Для этого служит метод Command. |