FTP-клиент

Ниже представлено консольное приложение, демонстрирующие работу простого 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.

 
« Предыдущая статья   Следующая статья »