2016-07-23 20 views
1

Ich lade die Bytes einer Datei aus dem Web mit Winsock2. so weit so gut. Ich habe das Problem, dass ich meine Bytes einschließlich der HTTP-Header, die ich nicht brauche und die Probleme in meinen Dateien Bytecodes verursacht herunterladen.C++ Winsock Download-Datei abgeschnitten HTTP Header

Beispiel: Example

Ich weiß, dass ich die Position finden kann, wo der Header von der Suche endet "\ r \ n \ r \ n". Aber irgendwie kann ich nicht finden, oder zumindest schneiden ... :(

int iResponseBytes = 0; 
ofstream ofDownloadedFile; 
ofDownloadedFile.open(pathonclient, ios::binary); 
do { 
    iResponseBytes = recv(this->Socket, responseBuffer, pageBufferSize, 0); 
    if (iResponseBytes > 0)  // if bytes received 
    { 
     ofDownloadedFile.write(responseBuffer, pageBufferSize); 
    } 
    else if (iResponseBytes == 0) //Done 
    { 
     break; 
    } 
    else //fail 
    { 
     cout << "Error while downloading" << endl; 
     break; 
    } 
} while (iResponseBytes > 0); 

Ich habe versucht, das Array/den Zeiger suchen jemand mit strncmp usw. Hoffentlich kann mir helfen.

Beste Grüße

Antwort

0

Sie haben keine Garantien, was auch immer, dass die \r\n\r\n Sequenz vollständig innerhalb eines einzigen recv() Anruf empfangen werden.

Zum Beispiel kann die erste recv() Anruf könnte bis zu den ersten beiden Zeichen der Sequenz, \r\n, alles, bis dann der Code läuft die Schleife wieder, und das zweite Mal recv() wird aufgerufen, erhält es die verbleibenden \r\n für die ersten zwei Bytes empfangen (gefolgt von der erster Teil des eigentlichen Inhalts). Eine kleine Möglichkeit, dass dies passieren könnte, aber es kann nicht ignoriert werden und muss korrekt behandelt werden.

Wenn Ihr Ziel ist, alles bis zum \r\n\r\n zu kürzen, wird Ihr aktueller Ansatz nicht sehr gut funktionieren.

Stattdessen sollten Sie etwas Zeit investieren, um zu untersuchen, wie die Pufferung von Dateiströmen tatsächlich funktioniert. Pontificate, für einen Moment, wie std::istream/std::ostream lesen/schreiben große Datenblöcke zu einer Zeit, aber sie bieten eine zeichenorientierte Schnittstelle. std::istream zum Beispiel liest einen Puffer voller Dateidaten gleichzeitig und legt sie in einen internen Puffer, den Ihr Code dann jeweils ein Zeichen nach dem anderen abrufen kann (falls gewünscht). Wie funktioniert das? Denk darüber nach.

Um dies richtig zu tun, müssen Sie den gleichen Algorithmus selbst implementieren: recv() aus dem Socket einen Puffer zu einem Zeitpunkt, dann stellen Sie eine Byte-orientierte Schnittstelle, um die empfangenen Inhalte ein Byte nach dem anderen zurückgeben.

Dann wird der Hauptcode eine einfache Schleife, Lesen der gestreamten Socket-Inhalt von Byte zu Byte, an welcher Stelle alles bis zum Code \r\n\r\n wird trivial (obwohl es noch ein paar nicht offensichtliche Fallstricke in tut dies richtig, aber das kann eine neue Frage sein).

Natürlich, sobald die \r\n\r\n verarbeitet wird, ist es sicherlich möglich, die Dinge weiter zu optimieren, durch Ausspülen, was immer noch intern gepuffert ist, auf die Ausgabedatei, und dann wieder lesen aus dem Socket ein ganzes Buffer-at-a -time, und kopiert es in die Ausgabedatei, ohne CPU-Zyklen mit der Byte-orientierten Schnittstelle zu brennen.