Problem bei Dateidownload ueber simplen HTTP GET Request



  • DaRe schrieb:

    recv liefert keinen '\0' am Ende des Strings... strlen sucht aber nach '\0':

    wenn ich ne http response mit stringfunktionen bearbeite, sorge ich dafür dass der empfangspuffer stets nullterminiert ist:

    char buf [ 1024 ] = { 0 };
    int bytes;
    bytes = recv ( sock, buf, sizeof ( buf ) -1, 0 ); // -1: terminierung ist sichergestellt
    ...
    

    denn sonst kann es passieren, dass strstr und co. bis zum abwinken suchen, wenn sie die 0 nicht finden.

    gruß,
    B.B.



  • Oh ja, langsam lern ich dieses '\0' hassen.

    Wenn sein Header, wie er sagt nicht wirklich größer wird als 505 Byte oder sowas, dann ist die NULL-Prüfung auf strstr eigentlich nicht nötig... aber ich weiß nicht, was er da wirklich für nen Server am Start hat ^^

    Aber na gut, die erste Variante sollte nicht verwendet werden.



  • Big Brother schrieb:

    DaRe schrieb:

    recv liefert keinen '\0' am Ende des Strings... strlen sucht aber nach '\0':

    wenn ich ne http response mit stringfunktionen bearbeite, sorge ich dafür dass der empfangspuffer stets nullterminiert ist:

    char buf [ 1024 ] = { 0 };
    int bytes;
    bytes = recv ( sock, buf, sizeof ( buf ) -1, 0 ); // -1: terminierung ist sichergestellt
    ...
    

    denn sonst kann es passieren, dass strstr und co. bis zum abwinken suchen, wenn sie die 0 nicht finden.

    gruß,
    B.B.

    Kommt immer drauf an, ob man nur

    Content-Type: text/*
    

    erwartet. Dann macht es Sinn

    buf[bytes] = 0
    

    zu setzen.

    Alles andere wird komplizierter und braucht das nicht.
    Du musst dir nur die verschiedenen Positionen in den Puffern merken, die Puffer evtl. neu allozieren, mit memcpy kopieren, von der letzten Suchposition (Suchwortlänge-1) abziehen wenn du optimieren willst, usw. usf.

    Noch komplizierter wird's bei HTTP 1.1 und Transfer-Encoding: chunked.



  • es ging mir hier um den http response header, nicht um den content.
    hast du wohl nicht gemerkt. 😉



  • Big Brother schrieb:

    es ging mir hier um den http response header, nicht um den content.
    hast du wohl nicht gemerkt. 😉

    Ne, hab ich nicht gemerkt.

    Wenn du 300 Byte Header und dann Binärdaten hast, die nach ein paar Bytes ein 0x00 enthalten - was macht es da für einen Sinn ein '\0' anzuhängen?

    OP wollte auch Binärdateien runterladen, strlen ist hier einfach falsch.
    strstr um das Headerende zu finden, dann mem*-Funktionen. So macht man das.

    EDIT: Ok, für strstr ist es notwendig (und ich mach es eigentlich auch grundsätzlich ;)), hab jetzt aber keine Lust meinen post noch zu ändern.


Anmelden zum Antworten