IdFTPServer Исключение «Сброс соединения по пиру» - PullRequest
0 голосов
/ 16 января 2019

Я установил простой FTPServer, который служит только для определенных целей. Наблюдая за кодом при выполнении get, я вижу, что GetFileDate и GetFileSize вызываются дважды, но я никогда не вижу, чтобы вызывался RetrieveFile. Вместо этого клиент показывает исключение «Сброс соединения по пиру».

Все свойства IdFTPServer по умолчанию, за исключением AllowAnonymousLogin. Отображается 100% кода FTP-сервера:

Я пытался изменить значение TerminateWaitTimeout, но это не помогло.

__fastcall TFTPServer::TFTPServer(TComponent* Owner) : TDataModule(Owner)
{
    root = IncludeTrailingPathDelimiter(GetCurrentDir()) + "files\\";
    IdFTPServer1->Active = true;
}

// ---------------------------------------------------------------------------
void __fastcall TFTPServer::Close(void)
{
    IdFTPServer1->Active = false;
}

// ---------------------------------------------------------------------------
void __fastcall TFTPServer::IdFTPServer1FileExistCheck(TIdFTPServerContext *ASender, const UnicodeString APathName, bool &VExist)
{
    String file = StringReplace(APathName, "/", "", TReplaceFlags() <<     rfReplaceAll);
    TSearchRec sr;
    int done = FindFirst(root + file, 0, sr);
    VExist = (done == 0);
    FindClose(sr);
}

// ---------------------------------------------------------------------------
void __fastcall TFTPServer::IdFTPServer1GetFileDate(TIdFTPServerContext *ASender, const UnicodeString AFilename, TDateTime &VFileDate)
{
    String file = StringReplace(AFilename, "/", "", TReplaceFlags() << rfReplaceAll);
    TSearchRec sr;
    int done = FindFirst(root + file, 0, sr);
    if (done == 0)
    {
        VFileDate = sr.TimeStamp;
    }
    FindClose(sr);
}

// ---------------------------------------------------------------------------
void __fastcall TFTPServer::IdFTPServer1GetFileSize(TIdFTPServerContext *ASender, const UnicodeString AFilename, __int64 &VFileSize)
{
    String file = StringReplace(AFilename, "/", "", TReplaceFlags() << rfReplaceAll);
    TSearchRec sr;
    int done = FindFirst(root + file, 0, sr);
    if (done == 0)
    {
        VFileSize = sr.Size;
    }
    FindClose(sr);
}

// ---------------------------------------------------------------------------
void __fastcall TFTPServer::IdFTPServer1RetrieveFile(TIdFTPServerContext *ASender, const UnicodeString AFileName, TStream *&VStream)
{
    String file = StringReplace(AFileName, "/", "", TReplaceFlags() << rfReplaceAll);
    VStream = new TFileStream(root + file, fmOpenRead);
}

// ---------------------------------------------------------------------------

Что мне не хватает?

...