TClientSocket + mehrere Dateien herunterladen?



  • Hey @all,

    das man mit TClientSocket eine Datei mit der GET Anweisung herunterladen kann ist klar. Aber wie kann ich beispielsweise mehrere Dateien herunterladen, den da scheitert es bei mir dauernd

    Hier mal mein Source

    void __fastcall TfrmMain::Button2Click(TObject *Sender) {
      try {
        frmNetwork->cbUseProxy->Checked = netopt->get_use_proxy();
        frmNetwork->tfProxyServer->Text = netopt->get_proxy_address().c_str();
        frmNetwork->tfProxyPort->Text = netopt->get_proxy_port().c_str();
        frmNetwork->tfProtocol->Text = netopt->get_protocol().c_str();
        frmNetwork->tfProtocolVersion->Text = netopt->get_protocol_version().c_str(); 
        frmNetwork->tfDownloadServer->Text = netopt->get_server_address().c_str();
        frmNetwork->tfDownloadPath->Text = netopt->get_server_path().c_str();
        frmNetwork->tfFilenameLayout->Text = netopt->get_filename_layout().c_str();
    
        string filename;
        int do_what = 0;
        if((cbDay1->ItemIndex >= 0 && cbMonth1->ItemIndex >= 0 && cbYear1->ItemIndex >= 0) &&
           !(cbDay2->ItemIndex >= 0 && cbMonth2->ItemIndex >= 0 && cbYear2->ItemIndex >= 0))
          do_what = 1;
        else if(!(cbDay1->ItemIndex >= 0 && cbMonth1->ItemIndex >= 0 && cbYear1->ItemIndex >= 0) &&
                (cbDay2->ItemIndex >= 0 && cbMonth2->ItemIndex >= 0 && cbYear2->ItemIndex >= 0))
          do_what = 2;
        else if((cbDay1->ItemIndex >= 0 && cbMonth1->ItemIndex >= 0 && cbYear1->ItemIndex >= 0) &&
                (cbDay2->ItemIndex >= 0 && cbMonth2->ItemIndex >= 0 && cbYear2->ItemIndex >= 0))
          do_what = 3;
        else
          throw GASException("You must define all fields in FROM, TO or BOTH!");
    
        bool day_zero = false;
        bool month_zero = false;
        switch(do_what) {
          case 1: this->year = cbYear1->ItemIndex + 1978;
                  this->month = cbMonth1->ItemIndex + 1;
                  this->day = cbDay1->ItemIndex + 1;
                  if((cbDay1->ItemIndex + 1) < 10)
                    day_zero = true;
                  if((cbMonth1->ItemIndex + 1) < 10)
                    month_zero = true;
                  break;
          case 2: this->year = cbYear2->ItemIndex + 1978;
                  this->month = cbMonth2->ItemIndex + 1;
                  this->day = cbDay2->ItemIndex + 1;
                  if((cbDay2->ItemIndex + 1) < 10)
                    day_zero = true;
                  if((cbMonth2->ItemIndex + 1) < 10)
                    month_zero = true;
                  break;
        }
    
        // building filename
    
        this->filename = netopt->parse_macros(netopt->get_filename_layout(), year, month, day);
        string tmpDir = this->directory;
        string tmpFilename;
    
        if(this->directory != "") {
          check_for_slashes(tmpDir, false);
          check_for_bslashes(tmpDir, true);
          tmpFilename = tmpDir + this->filename;
        }
    
        // Datei am Server - Lokales Verzeichnis - Lokale Datei
        this->lfd.push_back(FileData("1.gif", this->directory, "test1.gif"));
        this->lfd.push_back(FileData("2.gif", this->directory, "test2.gif"));
        this->lfd.push_back(FileData("3.gif", this->directory, "test3.gif"));
        this->lfd.push_back(FileData("4.gif", this->directory, "test4.gif"));
        this->lfd.push_back(FileData("5.gif", this->directory, "test5.gif"));
        this->lfd.push_back(FileData("6.gif", this->directory, "test6.gif"));
        this->lfd.push_back(FileData("7.gif", this->directory, "test7.gif"));
        this->lfd.push_back(FileData("8.gif", this->directory, "test8.gif"));
        this->lfd.push_back(FileData("9.gif", this->directory, "test9.gif"));
        this->lfd.push_back(FileData("10.gif", this->directory, "test10.gif"));
    
    //    lfd.push_back(FileData(this->filename, this->directory, tmpFilename));
    
        // Wird ein Proxy benutzt?
        if(netopt->get_use_proxy()) {
          ClientSocket1->Host = netopt->get_proxy_address().c_str();
          ClientSocket1->Port = StrToInt(netopt->get_proxy_port().c_str());
        }
        else if(!netopt->get_use_proxy()) {
          ClientSocket1->Host = netopt->get_server_address().c_str();
          ClientSocket1->Port = 80;
        }
    
        if(!ClientSocket1->Active) {
          ClientSocket1->Open();
          frmProgress->Bar->Max = lfd.size();
          frmProgress->Bar->Position = 0;
          frmProgress->Show();
        }
    
      }
      catch(GASException& e) {
        Application->MessageBoxA(e.what(), e.error(), MB_OK); 
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) {
      unsigned int file_counter = lfd.size();
      for(lfdIter = lfd.begin(); lfdIter != lfd.end(); ++lfdIter) {
        file_counter-=1;
        this->file_id = file_counter;
    
        AnsiString progress_message;
        progress_message.cat_sprintf("%d/%d %s", lfd.size()-file_counter, lfd.size(), this->lfd[this->file_id].full_local_path.c_str());
        frmProgress->lDownloadFile->Caption = progress_message;
    
        AnsiString get_buffer;
        get_buffer.cat_sprintf("GET %s%s/%s/%s HTTP/%s \n\n", netopt->get_protocol().c_str(),
                                                              ClientSocket1->Host,
                                                              netopt->parse_macros(netopt->get_server_path(), year, month, day).c_str(),
                                                              this->lfd[this->file_id].server_file.c_str(),
                                                              netopt->get_protocol_version().c_str());
        memory = new TMemoryStream();
        found_gif = false;
        ClientSocket1->Socket->SendText(get_buffer);
        _sleep(2);
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) {
      bool is_header = false;
      is_error = false;
      if(!found_gif) {
        AnsiString Response;
        int nBytes = ClientSocket1->Socket->ReceiveLength();
        BYTE *Buffer = new BYTE[nBytes];
        ClientSocket1->Socket->ReceiveBuf(Buffer, nBytes);
        for(int i=0; i<nBytes; i++) {
          if((Buffer[i] == 'G' && Buffer[i+1] == 'I' && Buffer[i+2] == 'F') ||
             is_header) {
    	is_header = true;
            BYTE *b = new BYTE[1];
            b[0] = Buffer[i];
    	memory->Write(b, 1);
          }
          else if ((Buffer[i] == 'N' && Buffer[i+1] == 'o' && Buffer[i+2] == 't' &&
                    Buffer[i+3] == ' ' && Buffer[i+4] == 'F' && Buffer[i+5] == 'o' &&
                    Buffer[i+6] == 'u' && Buffer[i+7] == 'n' && Buffer[i+8] == 'd')) {
    	is_header = true;
            is_error = true;
          }         
        }
        found_gif = true;
      }
    
      if(found_gif && !is_error) {
        AnsiString Response;
        int nBytes = ClientSocket1->Socket->ReceiveLength();
        BYTE *Buffer = new BYTE[nBytes];
        ClientSocket1->Socket->ReceiveBuf(Buffer, nBytes);
        memory->Write(Buffer, nBytes);
      }
      else if(is_error) {
        ClientSocket1->Close();
        Application->MessageBoxA("Sorry, but the requested file doesn't exist!", "ERROR", MB_OK);
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) {
      if(!is_error) {
        ProgressBar1->Max = memory->Size;
        ProgressBar1->Position = 0;
        memory->Position = 0;
    
        // Writing file
        memory->SaveToFile(this->lfd[this->file_id].full_local_path.c_str());
    
        ProgressBar1->Position = memory->Size;
        ClientSocket1->Close();
    
        if(Application->MessageBoxA("Download finished!", "SUCCESS", MB_OK) == ID_OK)
        ProgressBar1->Position = 0;
    
        delete memory;
        _sleep(3);
        if(this->file_id == 0) {
          ClientSocket1->Close();
          if(Application->MessageBox("Download completed!", "Info", MB_OK) == ID_OK) {
            frmProgress->Position = 0;
            frmProgress->Close();
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket,
                                                 TErrorEvent ErrorEvent, int &ErrorCode) {
      // analyse ErrorEvent
      String Msg = "Unspecified ClientSocket error.";
      switch(ErrorEvent) {
        case eeGeneral :
          Msg = "The socket received an error message that does not fit into any category.";
        case eeSend :
          Msg = "An error occurred when trying to write to the socket connection.";
          break;
        case eeReceive :
          Msg =  "An error occurred when trying to read from the socket connection.";
          break;
        case eeConnect :
          Msg = "A connection request that was already accepted could not be completed.";
          break;
        case eeDisconnect :
          Msg = "An error occurred when trying to close a connection.";
          break;
        case eeAccept :
          Msg = "A problem occurred when trying to accept a client connection request.";
      }
      Application->MessageBox(Msg.c_str(), "ClientSocket Error", MB_OK | MB_ICONSTOP);
    
      // prevent exception
      ErrorCode = 0;
    }
    //---------------------------------------------------------------------------
    

    Kann mir jemand sagen, was ich da falsch mache? Mit Thread's kenne ich mich leider noch nicht aus, aber es sollte doch hintereinander funktionieren.

    Vielen Dank im Voraus

    Lg _freeze_



  • Warum erstelst du 2 thread mit der gleichen Frage?
    Sowas ist hier unerwünscht... der eine thread reichte schon..



  • Sorry, für den zweiten Thread, kann ein Moderator bitte meinen ersten Thread löschen

    Vielen Dank
    Lg _freeze_


Anmelden zum Antworten