FtpGetFile WinINEt никогда не возвращается

У меня возникла любопытная проблема (очень странно, позвольте мне сказать, хе-хе). Если во время загрузки по 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)

Кто-нибудь может это подтвердить? Должен ли я рефакторинг своего кода и искать обновления?

Спасибо

-1

Решение

Я нашел способ загрузки файлов без использования 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]