Почему загруженные файлы случайно повреждаются и / или становятся неполными при использовании Poco Libs? - PullRequest
0 голосов
/ 13 декабря 2018

Я написал простое приложение, использующее HTTP-библиотеку Pocos.Приложение загружает файл из заданного источника, расшифровывает и затем загружает его на S3.Есть тысячи файлов, которые должны быть обработаны таким образом, и они должны быть завершены не более 7 дней с момента их появления на исходном сервере.Чтобы избежать головной боли, связанной с многопоточностью моего приложения, я решил просто запустить несколько процессов приложения (более 16).

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые файлы случайно не загружаются полностьюили они не могут расшифровать, скорее всего, из-за поврежденного файла.

Я запустил один экземпляр приложения в отладчике Visual Studio и позволил ему работать в течение 48 часов, и он загрузил около 1200 файлов.Ни одной ошибки.Нет неполных загрузок и плохих расшифровок.Но как только я запускаю больше процессов (обычно больше 4) приложения, я начинаю получать сообщения об ошибках, описанных выше.

Я не уверен, что Poco делает что-то странное, или в Windows есть ошибка иЯ озадачен тем, как проверить, что проблема в сети является проблемой, и как ее решить (очевидно, балансировка нагрузки, но не существует способа ограничить использование приложением% пропускной способности.

Вотскачать код, который я использую:

URI uri(DownloadRequestURL);
HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest req(HTTPRequest::HTTP_GET, DownloadRequestURL, HTTPMessage::HTTP_1_1);
session.setKeepAlive(true);

HTTPResponse response;
istream* fileStream;

try
{
    session.sendRequest(req);


    fileStream = &session.receiveResponse(response);
}
catch (NetException& exc)
{
    return false;
}
catch (...)
{
    return false;
}


HTTPResponse::HTTPStatus status = response.getStatus();
if (status != HTTPResponse::HTTPStatus::HTTP_OK)
{
    return false;
}

ofstream encryptedFile(Filename, std::ios::out | std::ios::binary);

unsigned long long BytesDowned = StreamCopier::copyStream64(*fileStream, encryptedFile);

encryptedFile.close();
...