Проблема с FtpGetFile

Discussion in 'WASM.NETWORKS' started by XshStasX, Aug 2, 2010.

  1. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    FtpGetFile возвращает 0, а GetLastError() 12018.
    Код примера:
    Code (Text):
    1. DWORD FTPGetFile(LPWSTR address,LPWSTR user,LPWSTR pasw,LPWSTR local_file,LPWSTR remote_file,DWORD attr){
    2.  HINTERNET hConnect = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    3.   if (!hConnect) return 0;
    4.   HINTERNET hFTP=InternetConnect(hConnect,address,INTERNET_DEFAULT_FTP_PORT,user,pasw,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
    5.   DWORD ret_code ;
    6.   if (hFTP){
    7.      ret_code = FtpGetFile(hConnect,remote_file,local_file,false,attr,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0);
    8.     InternetCloseHandle(hFTP);
    9.     InternetCloseHandle(hConnect);
    10.   }
    11.    else
    12.   {
    13.       InternetCloseHandle(hConnect);
    14.       ret_code = 0;
    15.   };
    16.   return ret_code;
    17. };
    18.     FTPGetFile(_T("ftp.abcdef.com"),_T("abcdef_5939601"),_T("abcdef"),_T("F:\\remoute_ping.txt"),_T("htdocs/123/ping.txt"),FILE_ATTRIBUTE_NORMAL);
    В чем проблема ?... другие фтп клиенты могут получить файл.
     
  2. Flint_ta

    Flint_ta New Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    312
    FtpGetFile(hConnect,remote_file,local_file,false,attr,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD,0);

    тут кажется ты напутал, вместо hConnect поставь hFTP
     
  3. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Да ты прав.
    Может еще подскажешь в чем тут проблема:
    Code (Text):
    1. DWORD FTPPutFile(wchar_t* address,wchar_t* user,wchar_t* pasw,wchar_t* local_file,wchar_t* remote_file){
    2.  HINTERNET hConnect = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    3.   if (!hConnect) return 0;
    4.   HINTERNET hFTP=InternetConnect(hConnect,address,INTERNET_DEFAULT_FTP_PORT,user,pasw,INTERNET_SERVICE_FTP,INTERNET_FLAG_CACHE_IF_NET_FAIL  ,0);
    5.   DWORD ret_code ;
    6.   if (hFTP){
    7.     // FtpSetCurrentDirectory(hFTP,_T("/htdocs/"));
    8.     ret_code = FtpPutFile(hFTP,local_file,remote_file,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_TRANSFER_BINARY
    9. ,(DWORD_PTR)0);
    10.     GetLastError();
    11.  InternetCloseHandle(hFTP);
    12.     InternetCloseHandle(hConnect);
    13.   }
    14.    else
    15.   {
    16.       InternetCloseHandle(hConnect);
    17.       ret_code = 0;
    18.   };
    19.   return ret_code;
    20. };
    Значит FtpPutFile отправляет файл на сервер в течении 5-7сек, при этом она завершается возвращает 0.
    А GetLastError() возвращает 12002 ...?
    На сервере создается временный файл, который после некоторого времени пропадает от туда, а там появляется файл remote_file, но он пустой(.
    Розмер файла для отправки 400байт, канал 256кбит.
     
  4. Flint_ta

    Flint_ta New Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    312
    12002 ERROR_INTERNET_TIMEOUT The request has timed out.
    Может у тебя прав не хватает для создания файла в данной директории?
     
  5. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Клиент фтп может(FileZilla) закинуть туда файл, я ему даю той же логин/пароль.
    А где ты это описание взял ?...
     
  6. Flint_ta

    Flint_ta New Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    312
    Если не вызывать FtpSetCurrentDirectory, то в корневой директории файл создается без проблем? Если да, то вероятно что этой апи ты неверные параметры передаешь.

    Прицепляй к FileZilla отладчик ставь бряк на FtpSetCurrentDirectory, трейси и сравнивай результаты со своим кодом.

    http://junios.net/tc/tag/GetLastError
     
  7. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Она wininet не использует(.
    Аналогично получается, создается файл но пустой(.
     
  8. XshStasX

    XshStasX New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2008
    Messages:
    991
    Уррааа !!!! Нашол ошибку )))!!!
    Значит проблема была в том что файл еще был не создан когда вызывал FtpPutFile.
    Дописав две строки эту проблема пропала, вот решении ее:
    Code (Text):
    1. DWORD FTPPutFile(const wchar_t* address,const wchar_t* user,const wchar_t* pasw,const wchar_t* local_file,const wchar_t* remote_file){
    2. HINTERNET hConnect = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    3.   if (!hConnect) return 0;
    4.   HINTERNET hFTP=InternetConnect(hConnect,address,INTERNET_DEFAULT_FTP_PORT,user,pasw,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE ,0);
    5.   DWORD ret_code ;
    6.   if (hFTP){
    7.       HINTERNET hOpen = FtpOpenFile(hFTP,remote_file, GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_TRANSFER_BINARY,0);
    8.     InternetCloseHandle(hOpen);
    9.       ret_code = FtpPutFile(hFTP,local_file,remote_file,FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_TRANSFER_BINARY,(DWORD_PTR)0);
    10.     GetLastError();
    11.    
    12.     InternetCloseHandle(hFTP);
    13.     InternetCloseHandle(hConnect);
    14.   }
    15.    else
    16.   {
    17.       InternetCloseHandle(hConnect);
    18.       ret_code = 0;
    19.   };
    20.   return ret_code;
    21. };