1

私は基本的に安全なサーバーからファイルをダウンロードするこのデルファイコードを持っています(私が間違っていなければIndyビルド10.5.8 r4743を使用しています):

問題は次のとおりです。「Socket Error # 0」例外がランダムに発生し、修正も理解もできませんでした。

Project MyProject.exe raised exception class EIdSocketError with message 'Socket Error # 0

スタックはこちら、パスカル コードは次のとおりです。

IdHTTP            := TIdHTTP.Create(nil);
TheSSL            := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
TheCompressor     := TIdCompressorZLib.Create(nil);
TheCookieManager  := TIdCookieManager.Create(IdHTTP);

try SetupWebComponents(IdHTTP, TheSSL, TheCompressor, TheCookieManager); except end;

TheCookieManager.OnNewCookie := MainForm.SyncNewCookie;

// Go!
Stream            := TMemoryStream.Create;
try
   IsError        := False;
   try
      with IdHTTP do
      begin
           OnWork                := MainForm.IdHTTPWork_Download;
           try
              try
                 IsNewFile       := (Not FileExists(LocalFile));
                 if IsNewFile then
                    TheFile      := TFileStream.Create(LocalFile, fmCreate)
                 else
                     // File already exist, resume download
                     TheFile     := TFileStream.Create(LocalFile, fmOpenReadWrite);

                 DoExit          := False;

                 // Use [ Request.Referer ] it to pass VersionGUID to Work event (to record download progress in db)
                 Request.Referer := VersionGUID;
                 repeat
                       // Get resume byte
                       if IsNewFile then
                       begin
                            ResumeByte := 0;
                            IsNewFile  := False;
                       end
                       else
                           ResumeByte  := GetResumeByteFromDB();

                       if FileExists(LocalFile) then
                       begin
                            // File already exist, resume download
                            DoExit     := (ResumeByte >= TheFileSize);
                            TheFile.Seek(ResumeByte, soFromBeginning);
                       end;

                       // Save ResumeByte, it will be used to record download progress in db & eventually use it to resume downloads)
                       IdHTTP.Tag      := ResumeByte;

                       Request.Range := IntToStr(ResumeByte) + '-';

                       Get(TheURL, TheFile);
                       IsError         := (Not (ResponseCode in [200, 206])) OR (Pos('login', URL.Document) <> 0);

                       // Break if there's any error (to allow retrying later in a clean fashion)
                       if IsError then
                          Break;
                 until DoExit;

                 Disconnect;
              except
                    if (ResponseCode = 404) then
                    begin
                         // File doesn't exist, get out
                         Result        := False;
                         Exit;
                    end;
              end;    // try/except
           finally
                  FreeAndNil(TheFile);
           end;    // try/finally
      end;    // with
   except
         IsError  := True;
   end;    // try/except
finally
       Stream.Free;
end;

少し前に同様の質問を投稿しましたが、それはダウンロードではなくアップロードに関するものでした。それ以来、コードはSOメンバーの親切な助けを借りて修正され、同じコード(Cookieの処理、再ログインなどに使用されます...)が現在使用されているため、問題は実際に示されているダウンロード手順にあると思いますその上

誰かがこれを見て、私が間違っていることを教えてもらえますか?

4

1 に答える 1

2

他の質問と同様に、可能であればより新しいバージョンにアップグレードし、問題が引き続き発生することを確認してから、助けを求める必要があります。現在のバージョンは10.5.9 r4861です。

于 2012-11-05T23:02:15.617 に答える