У меня возникла любопытная проблема (очень странно, позвольте мне сказать, хе-хе). Если во время загрузки по FTP файла EXE (24 МБ) соединение прервано, возникает ошибка FtpGetFile библиотеки WinINEt, которая никогда не возвращается. Это приводит к сбою передачи файлов в будущем (соединение уже открыто).
Видимо, я нашел обходной путь, увеличив тайм-аут сервера, но мне это не нравится. Я не нашел подобную проблему, прибегая к помощи Google (возможно, я ввел неправильные ключевые слова).
Я читал некоторые форумы в Интернете, и кажется, что все не рекомендуют использовать FtpGetFile, потому что он глючит.
Это появляется в сетевом сценарии, который имеет большую задержку (и не всегда), но в хороших условиях он исчезает (загрузка происходит правильно, а FtpGetFile возвращается всегда).
Вот как я использую функцию:
if( FtpGetFile(m_hFtpSession, strSourcePath.c_str(), strTargetPath.c_str(), 0, 0, FTP_TRANSFER_TYPE_BINARY, 0)==TRUE)
Кто-нибудь может это подтвердить? Должен ли я рефакторинг своего кода и искать обновления?
Спасибо
Я нашел способ загрузки файлов без использования FtpGetFile. Я надеюсь, что этот код может кому-то помочь:
bool RetrieveFile(const string& strSource, const string& strTarget) {
/* The handle for the transfer */
HINTERNET hTransfer = NULL;
/*
* Set default error
*/
DWORD error = ERROR_SUCCESS;
if( !isConnected ) {
debug("%s(): ERROR not connected\n", __FUNCTION__);
return false;
}
/* Initiate access to a remote FTP connection */
hTransfer = FtpOpenFile(hFtpSession, strSource.c_str(), GENERIC_READ,
FTP_TRANSFER_TYPE_BINARY, 0);
if(hTransfer) {
std::ofstream myostream(strTarget.c_str(), std::ios::binary);
if ( myostream.is_open() ) {
static const DWORD SIZE = 1024;
BYTE data[SIZE];
DWORD size = 0;
do {
BOOL result = InternetReadFile(hTransfer, data, SIZE, &size);
if ( result == FALSE ) {
error = GetLastError();
Debug("InternetReadFile(): %lu\n", error);
}
myostream.write((const char*)data, size);
}
while ((error == ERROR_SUCCESS) && (size > 0));
// Close the stream
myostream.close();
}
else {
Debug("Could not open '%s'.\n", strTarget.c_str());
error = ERROR_FILE_NOT_FOUND; // Not necessarily not found, but it is to describe a file error which is different from ERROR_SUCCESS
}
// Close
const BOOL result = InternetCloseHandle(hTransfer);
if ( result == FALSE ) {
const DWORD error = GetLastError();
debug("InternetClose(): %lu\n", error);
}
/* Check error status of the process */
return (error == ERROR_SUCCESS);
}
DWORD dwInetError;
DWORD dwExtLength = 1000;
TCHAR *szExtErrMsg = NULL;
TCHAR errmsg[1000];
szExtErrMsg = errmsg;
int returned = InternetGetLastResponseInfo( &dwInetError, szExtErrMsg, &dwExtLength );
debug("dwInetError: %d Returned: %d\n", dwInetError, returned);
debug("Buffer: %s\n", szExtErrMsg);
debug("%s() : ERROR to get '%s' file (errorCode=%d)\n", __FUNCTION__, strSource.c_str(), GetLastError());
return false;
}
Других решений пока нет …