Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Некорректная работа FtpGetFile()

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Некорректная работа FtpGetFile()
Имя
Сообщение << Старые топики   Новые топики >>
Некорректная работа FtpGetFile() - 2009-04-30 13:02:44.133333   
opiume123

Сообщений: 3
Оценки: 0
Присоединился: 2009-04-30 12:52:16.470000
Прошу помощи. Я использую Visual C++ 9.0.

#include "stdafx.h" #include &lt;windows.h&gt; #include &lt;wininet.h&gt; #pragma comment(lib,"wininet") #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; void zapis(HINTERNET hConnect1,WIN32_FIND_DATA struktura) {    TCHAR filenames[270]=TEXT("C:\\123\\");    for(int i=0;i&lt;256;i++)    {        filenames[i+7]=struktura.cFileName[i];    }      if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))       {           cout&lt;&lt;"File Downloaded"&lt;&lt;std::endl;                 }       else       {           cout&lt;&lt;"File  Error"&lt;&lt;std::endl;       } } int _tmain(int argc, _TCHAR* argv[]) {    bool ok = false;    HINTERNET hInternet=::InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"),            INTERNET_OPEN_TYPE_PRECONFIG,            NULL,NULL,            0); if (hInternet != NULL) {        // открываем FTP сессию    DWORD_PTR asd=0;        HINTERNET hConnect =            ::InternetConnect(                hInternet,                TEXT("192.168.131.134"),                INTERNET_DEFAULT_FTP_PORT,                NULL,NULL,                INTERNET_SERVICE_FTP,                0,                (DWORD)0);        if (hConnect != NULL)             {               cout&lt;&lt;"yes"&lt;&lt;std::endl;               WIN32_FIND_DATA sss;               WIN32_FIND_DATA aaa;               LPTSTR buffer111=TEXT("/ftproot");                             if(FtpSetCurrentDirectory(hConnect,buffer111))               {                   HINTERNET FileFTP;                   FileFTP=FtpFindFirstFile(hConnect,TEXT("*.bin"),&sss,INTERNET_FLAG_NEED_FILE,0);                                 if(FileFTP!=NULL)               {                   cout&lt;&lt;"New files are on server"&lt;&lt;std::endl;                   //char* qsc="C:\\123\\";                   //TCHAR csq[10];                   //::WideCharToMultiByte(1251, MB_PRECOMPOSED, qsc, -1, csq, 10);                                     //TCHAR namefiled[270];                   //*namefiled=*csq + *sss.cFileName;                   BOOL Uslovie=TRUE;                   while(Uslovie)                   {                       zapis(hConnect,sss);                       if(InternetFindNextFile(FileFTP,&sss)==TRUE) Uslovie=TRUE;                       else Uslovie=FALSE;                   }                                         cout&lt;&lt;"File  END"&lt;&lt;std::endl;                                                       }               else               {                                     cout&lt;&lt;"NO"&lt;&lt;std::endl;                   DWORD WINAPI asdf=GetLastError();                   cout&lt;&lt;asdf;               }                           }               else cout&lt;&lt;"no";        }        else        {            cout&lt;&lt;"no";                    }                    // закрываем сессию            ::InternetCloseHandle(hConnect);        }        // закрываем WinInet        ::InternetCloseHandle(hInternet);          return 0; }
Дело в том, что в начале программа работает в целом нормально. Т.е. при
скачивании первых 10 или 13 файлов с сервера. Файлы скачиваются в
нужную мне папку с нужным именем. Но затем, при скачивании 11 или 14
файла программа может или зависнуть или отправить всю систему в
перезагрузку. При установки точки останова на строке
if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))
Оказалось,
что все параметры передаваемые в функцию, верные (т.е. именно те
значения, которые и должны быть). (Мне кажется, что некорректное
поведение программы вызвано именно этой строкой, т.к. это последняя
фукция, которая вызывается перед зависанием или перезагрузкой). Более
того, по записям логов сервера оказалось, что при запросе последнего
файла (того, на котором происходит сбой) корректно происходит запрос
размера этого файла и начинается его скачка, но успешно она не
заканчивается, т.к. система или перезагружается, или сервер разрывает
соединение по завершению тайм-аута.

В случае, когда происходит
перезагрузка данный файл вообще не записывается на диск. А если
программа "виснет", то файл на диск все же записывается, но не весь, а
только первые 4 Кb. При этом открыть файл при запущенной программе
невозможно, т.к. он уже открыт в монопольном режиме моей программой,
т.е. похоже, что она пытается записать в него информацию.

Я не могу понять в чем причина некорректной работы прграммы.
Если кто-нибудь может подсказать чем вызваны такие ошибки, прошу помочь.
Post #: 1
RE: Некорректная работа FtpGetFile() - 2009-04-30 13:51:27.116666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Юзай теги code и /code для оформления кода. Читать невозможно. Первое, что приходит на ум - у тебя вирусы :)
Post #: 2
RE: Некорректная работа FtpGetFile() - 2009-04-30 18:04:20.313333   
opiume123

Сообщений: 3
Оценки: 0
Присоединился: 2009-04-30 12:52:16.470000
_SaZ_
Вирусов у меня нет. Точно это, конечно, никто сказать не сможет, но код тестился на 2 системах. Причем одна из них была после переустановки ОС, и на обоих стоит Dr. Web с последними базами.
А насчет тегов, спасибо, учту.
Post #: 3
RE: Некорректная работа FtpGetFile() - 2009-05-03 15:41:39.560000   
opiume123

Сообщений: 3
Оценки: 0
Присоединился: 2009-04-30 12:52:16.470000
С проблемой разобрался. Оказалось, что ошибки в работе возникают только в том случае, если сервер локальный.
Кстати, никто не знает почему так?
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Некорректная работа FtpGetFile()







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.