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_