Datei downloaden probleme mit dem HTTP Header



  • So hab ich mir den Code fürs Parsen vorgestellt. Er ist höchstwahrscheinlich falsch und eventuell kann man es einfacher machen.

    const unsigned int STATE_0 = 0;
    const unsigned int STATE_R = 1;
    const unsigned int STATE_RN = 2;
    const unsigned int STATE_RNR = 3;
    const unsigned int STATE_RNRN = 4;
    
    unsigned int state = STATE_0;
    
    void parse(const char* pBuffer, size_t bufferSize)
    {
    	for(size_t i = 0; i < bufferSize; ++i)
    	{
    		if(pBuffer[i] == '\r')
    		{
    			if(state == STATE_0)
    			{
    				state = STATE_R;
    			}
    			else if(state == STATE_RN)
    			{
    				state = STATE_RNR;
    			}
    			else
    			{
    				state = STATE_0;
    			}
    		}
    		else if(pBuffer[i] == '\n')
    		{
    			if(state == STATE_R)
    			{
    				state = STATE_RN;
    			}
    			else if(state == STATE_RNR)
    			{
    				state = STATE_RNRN;
    			}
    			else
    			{
    				state = STATE_0;
    			}
    		}
    		else
    		{
    			state = STATE_0;
    		}
    
    		if(state == STATE_RNRN)
    		{
    			std::cout << "Header complete" << std::endl;
    			break;
    		}
    	}
    }
    

    Ich wüsste nicht wie man es sonst machen kann.



  • Hi all,

    wozu den ganze Stress???

    Wenn du von einer URL eine Datei downloaden willst, benutze einfach die Funktion
    "URLDownloadToFileA()" aus "urlmon.dll"

    geht viel einfacher 🙄



  • char buffer[1000];
    char buffer2[1000];
    
    rc=recv(s,buffer,1000,0);
    temp = buffer;
    pos = temp.find("\r\n\r");
    
    if(pos != std::string::npos)
    {
    	temp.erase(0, pos + 4);
    	strcpy(buffer2, (char*)temp.c_str());
    	out.write((char*)buffer2, temp.length());
    }
    

    das ist mein ansatzt, funktioniert eben wie erwartet nicht





  • burnner es ist nicht garantiert das \r\n\r\n in genau einem Aufruf von recv bekommst. Es könnte im "schlimmsten" Fall sein das du mit jedem Aufruf von recv nur ein Zeichen bekommst.

    Aber ich glaub du benutzt besser die Funktionen aus der WinInet Library. InternetXXX.



  • Keine Ahnung scheint Ahnung zu haben wie man es sich einfach macht. 😉



  • so:

    char url[] = "http:/bla.com/source.exe";
    char file[] = "C:\\destin.exe";

    URLDownloadToFile(NULL, url, file, NULL, NULL);

    irgenwie so muss es in C++ aussehen 😃

    sorry aber ich komme aus win32-Assemblerprogrammierer-Welt 😉



  • if(pos != std::string::npos)
    {
    	temp.erase(0, pos + 4);
    //	strcpy(buffer2, (char*)temp.c_str());
    	out.write((char*)temp.c_str(), temp.length());
    }
    

    hat aber nichst mit dem allgemeinen problem zu tun das schon angesprochen wurde.
    ich weis auch nicht in wie weit bei deinem download die null terminierung eine
    rolle spielt. ich würde dir auch zu den winapi funktionen raten.



  • Keine Ahnung schrieb:

    so:

    char url[] = "http:/bla.com/source.exe";
    char file[] = "C:\\destin.exe";

    URLDownloadToFile(NULL, url, file, NULL, NULL);

    irgenwie so muss es in C++ aussehen 😃

    sorry aber ich komme aus win32-Assemblerprogrammierer-Welt 😉

    Selbstverständlich muss die dll erst in den Speicher geladen, und die Funktion gefunden werden:

    LoadLibrary();
    GetProcAddress();



  • Selbstverständlich muss die dll erst in den Speicher geladen, und die Funktion gefunden werden:

    LoadLibrary();
    GetProcAddress();

    Hallo fremder!
    Wir haben dafür urlmon.lib.



  • lib schrieb:

    Selbstverständlich muss die dll erst in den Speicher geladen, und die Funktion gefunden werden:

    LoadLibrary();
    GetProcAddress();

    Hallo fremder!
    Wir haben dafür urlmon.lib.

    Und wir (ASM-Progger) haben es nicht immer 😃
    Besonderes wenns um Shellcodeprogrammierung geht 😃 😃 😃
    Am sonsten gehts dann noch einfacher 👍 hast du Recht
    Grüß


Anmelden zum Antworten