Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача файла, IdTCPClinet & IdTCPServer 
V
    Опции темы
AlexBuga
Дата 18.6.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.6.2011

Репутация: нет
Всего: нет



Здравствуйте! Интересует одна проблема. Пишу приложение на RAD Studio C++ Builder XE (2011). Когда стоял простой дистрибутив всё было хорошо, после установки обновления появились проблемы (по крайней мере мне так показалось). Есть клиент и сервер. Реализована передача данных(а именно файлов) между клиентом и сервером. Каждые пару секунд клиент теряет соединение с сервером. Нет никаких определенных условий, всё , скажем так, спонтанно. Клиент может получить меньшее кол-во данных чем должен отправить сервер (измеряется в кол-во переданных байт TFileStream), либо вовсе потерять соединение. Виснет ровно до следующего запроса на передачу файла(иногда, в редких случаях, немного дольше). Тестами было установлено что интернет (коннект, скорость, пинг, прочее) тут не при чем (тестировалось на разных машинах с разными провайдерами). Если отключить Nagle алгоритм качество передачи увеличивается, но время от времени данные проблемы всё же появляются. Собственно код:
Клиент:

Код

inline bool DirectDownload(UnicodeString FileName, UnicodeString& Dest)
{

    Synchronize(&ZeroDProgress);//ставим в начало полосу загрузки
    HANDLE Handle = CreateFile(aDest.w_str(),GENERIC_READ | GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);

    if (Handle != INVALID_HANDLE_VALUE)
    {
        CloseHandle(Handle);//цель просто создать пустой файл
        Buff=new TFileStream(Dest,fmOpenWrite);

        Updater::FileName = FileName;
        Synchronize(&TCPSendFileName);

        if (FileSize == -1) {
            delete Buff;
            DeleteFile(Dest);
            return false;
        }
        while (1)
        {
            try
            {
                Synchronize(&TCPReadFile);
                len = Buff->Position;
                Synchronize(&UpDirectProgress);

                if ( FileSize == Buff->Position ) {
                    delete Buff;
                    return true;
                }
            }
            catch (...)
            {
                delete Buff;
                DeleteFile(Dest);
                return false;
            }
        }
        delete Buff;
        DeleteFile(Dest);
        return false;
    }
    else
    {
        int i = GetLastError();
        UnicodeString str = L"Direct Download. Error in creating file: ";
        str += i;

        AddLog(str);
        return false;
    }
}


void __fastcall Updater::TCPSendFileName()
{
    Form3->TC->IOHandler->WriteLn(L"file",enc->Unicode);
    Form3->TC->IOHandler->WriteLn(FileName,enc->Unicode);
    FileSize = Form3->TC->IOHandler->ReadInt64();
}

void __fastcall Updater::TCPReadFile()
{
    Form3->TC->IOHandler->ReadStream(Buff, -1 , false);
}



Серверная часть:
Код

    else if ( command == L"file" ) {
        UnicodeString FileName = AContext->Connection->IOHandler->ReadLn(enc->Unicode);
        if (FileName[FileName.Length()] == L'\r') {
            FileName.Delete(FileName.Length(),1);
        }


        FileName=Edit6->Text+FileName;
        if (!FileExists(FileName,false) ) {
            __int64 i = -1;
            AContext->Connection->IOHandler->Write( i );
        }

        TFileStream *File=new TFileStream(FileName,fmOpenRead | fmShareDenyWrite);
       File->Position=0;
        AContext->Connection->IOHandler->Write( File->Size );
        int cLast=0;
        bool Last=false;
        while (1)
        {
            if ( File->Position + SendLen > File->Size) {
                Last=true;
                cLast=File->Size - File->Position;
            }
            try
            {
                if (Last) {
                    if (cLast) {
                        AContext->Connection->IOHandler->Write(File,cLast,true);
                    }
                    break;
                }
                else
                    AContext->Connection->IOHandler->Write(File,SendLen,true);
           }
            catch (...)
            {
               AContext->Connection->IOHandler->Write( File->Position );
                break;
            }
        }
        delete File;
    }


Это сообщение отредактировал(а) AlexBuga - 18.6.2011, 15:59
PM MAIL   Вверх
AlexBuga
Дата 23.6.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.6.2011

Репутация: нет
Всего: нет



Вопрос всё еще актуален. Код переделал под 

Код

AContext->Connection->IOHandler->Write(File,-1,true);


Nagle выключен. Качает нормально примерно до 300 файлов. Дальше начинаются проблемы с коннектом. Что делать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0409 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.