C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 FTP-клиент / FTP / Сеть

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.