|
저도 전에 이것 때문에 무척 고생한적이 있읍니다.
BDS2007 Indy10만에 문제가 아니라 indy FTP자체의 문제 같읍니다.
많은수의 파일을 Get,Put등로 업/다운시 어느순간 멈추어 버리는 현상이 있읍니다.
리턴값이나 Exeception이 나오면 에러로 처리해서 넘어가는데 아에 멈쳐버리니 정말 돌아가시죠....
원인은 일시적인 네트워크장애나 원인모를 장애인데 저는 네트워크로 보고 있읍니다.
(특히 네트워크망이 복잡하게 얽혀 있을때)
해결책은 indyFTP대신에 순수API(혹은 MFC)로 구현된 FTP소스를 구해 사용한다. (리턴값은 온다)
indyFTP은 꼭 사용해야 된다면 get,put동작을 감시하는 타이머나 쓰레드로 Timeout처리한다
타이머시작 -> 타이머 => 3분설정(Abort호출 후 Disconnect시킴)
get
타이머종료
Timeout처리후 재접속하여 get/put을 처리한다.
그럼 도움이 되었으면 하네요~~~~~
DoyongID 님이 쓰신 글 :
: 인디10이고요.... 총 1.6기가 정도의 파일을 FTP로부터 받고요.. 파일갯수는 2600여개 됩니다..
:
: 그런데, 받다가 어느 순간이 되면(유동적)...
:
: 그냥 다운로드가 멈춰버립니다.. 예외처리로 검출되는 에러도 없고요..
:
: 메시지를 찍어보니 Get()에서 멈춥니다.. Get()에서 빠져나오지 못하고요.. 해당 파일은 0바이트로 저장됩니다..
:
: OnStatus()에서 메시지를 찍어보니 "Starting FTP transfer."가 찍히고, 한참 있다가 "Transfer complete."라고 찍히고 그걸로 끝입니다..
:
: 왜 그럴까요? 소스가 지저분하지만 다운로드하는 소스는 아래와 같습니다..
:
: bool TUpdate::DownloadFile(void)
: {
: int i, Count = 0;
: char DownDirName[1024], DownFileName[1024], SaveFileName[1024];
: TFileStream *clFs;
:
: // 다운받을 총 파일 용량 대입
: Synchronize(&ApplyTotalSize);
:
: for(i = 0; i < DownCount; i++)
: {
: sprintf(DownFileName, "/%s/Version/%d/%s", exGameName.c_str(), DownList[i].Version, DownList[i].FileName);
: sprintf(SaveFileName, "%sPatch\\%s", (exInstallPath + "\\" + exGameName + "\\").c_str(), DownList[i].FileName);
:
: // 현재 총 다운로드 파일 갯수 누적
: CurrCount++;
:
: // 현재 받고 있는 파일명
: CurrentFileName = DownList[i].FileName;
:
: ReDown:
: if(Count > 100)
: {
: RemoveFile();
:
: return false;
: }
:
: try
: {
: CurrentFileName = DownFileName;
: CurrentFileSize = DownList[i].FileSize;
:
: // 현재 다운받는 파일 용량 대입
: Synchronize(&ApplyFileSize);
:
: if(Win_Main->Bar_File->MaxValue == 0)
: {
: Count++;
:
: printf("TUpdate::DownloadFile1() - Count : %d\n", Count);
:
: goto ReDown;
: }
:
: // 다운로드 시작
: printf("Down(%d) : %s\n", i, DownFileName);
: Win_Main->FTP_Update->Get(DownFileName, SaveFileName, true, false);
:
: // 현재 총 다운로드 용량 누적
: CurrByte += Win_Main->Bar_File->MaxValue;
:
: Count = 0;
: }
: catch(Exception &e)
: {
: Count++;
:
: printf("TUpdate::DownloadFile2() - Count : %d, Msg : %s\n", Count, e.Message.c_str());
:
: goto ReDown;
: }
: }
:
: return true;
: }
|