IdFTPServer Исключение "Сброс соединения по пиру"
Я установил простой 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);
}
// ---------------------------------------------------------------------------
Что мне не хватает?