Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 октября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
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.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS