recv HTTP problem



  • EOutOfResources schrieb:

    ➡ Debugger

    👍

    Ich les mir das jetzt nicht alles haarklein durch, aber ein typischer Fehler wäre eine vergessene Nullterminierung.



  • cooky451 schrieb:

    aber ein typischer Fehler wäre eine vergessene Nullterminierung.

    Oder aber nicht beachtet, dass recv und Konsorten eben keine Nullterminierung einbauen sondern zurückgeben, wie viele Zeichen epfangen wurden. Wenn man dann mehr als das einliest, gibts am Ende Zeichensalat frisch aus dem uninitialisierten Buffer.



  • Darter schrieb:

    if(phe->h_length != 4)
    {
    	std::cout << "Ungueltiger IP-Typ!" << std::endl;
        return false;
    }
    

    Ich vermute du tust das, weil du kein IPv6 unterstützt. Das ist jedoch nicht nötig, da es für IPv4 (das von dir abgefragte) AF_INET und für IPv6 AF_INET6 gibt.



  • Eine gängige Technik wäre

    int recvSize = 0; // Empfangene Bytes insgesamt
            char buf[1024];
            int bytesRecv = -1; // Empfangene Bytes des letzten recv
    
            body.clear();
            std::string tmpBody;
    
            if(size != noSizeGiven) // Wenn die Größe über Content-length gegeben wurde
            {
                std::cout << "0%";
                while(recvSize < size)
                {
                    if((bytesRecv = recv(Socket, buf, sizeof(buf)-1, 0)) <= 0)
                    // das letzte Byte in buf gehört der \0
                    {
                        std::cout << "Error while resiving via content-length" << std::endl;
                        return false;
                    }
                    recvSize += bytesRecv;
                    buf[bytesRecv] = \0;
                    // die string::operator+(char*) Methode liest bis zum \0 Byte
                    tmpBody += buf;
                    std::cout << "\r" << recvSize * 100 / size << "%" << std::flush; // Mit \r springen wir an den Anfang der Zeile
                }
            }
    


  • Hey.

    Der letzte beitrag klinkt für mich einleuchten.
    allerdings wird das so nicht funktionieren:

    buf[bytesRecv] = \0;
    

    eher so:

    buf[bytesRecv] = '\0';
    

    So habe ich es dann auch Probiert, alerdings erhalte ich dann folgenen runtime-Error:

    Run-Time Check Failure #2 - Stack around the variable 'buf' was corrupted.
    

    Also dachte ich mir, ich überlaufe den Index des Arrays und hab es so Probiert:
    EDIT: meinte natürlich so:

    buf[bytesRecv - 1] = '\0';
    

    So wird mir aber leider bei jedem Part das letzte Zeichen "geklaut".

    Außerdem ensteht dieser runtime-Error immer erst dann, wenn der ganze Quelltext schon empfangen wurde.

    EDIT: Nun hab ich überprüft wie viele bytes bei jedem druchlauf der Schleife tatsächlich empfangen werden. Bis zum letzen Schleifendurchgang werden immer 1024 Bytes empfangen, also sie größe meines Buffers. Beim letzten durchgang sind es natürlich weniger, da es schon ein extremer Zufall wäre, dass es genau aufgeht, und genau da ensteht der Fehler, was ich mir noch nicht ganz erklären kann

    mfg Darter



  • Du mußt auch daran denken, daß der Buffer groß genug ist für die pro Durchlauf empfangenen Daten UND den Null-Terminator. Darum steht in mugga's Beitrag auch "sizeof(buf)-1" beim recv()-Befehl.

    (der Fehler entsteht schon viel früher, wird allerdings erst am Funktionsende bemerkt, wenn die Debug-Sicherungen überprüfen, ob du nichts kaputt gemacht hast)



  • Sorry, hätte das wohl deutlicher kennzeichnen müssen.



  • Ok, sry hab ich doch tatsächlich übersehen, also lag ich doch richtig, dass ich den Index des Array überlaufe. (so nebenbei, sagt man dass so ? ^^)



  • Im englischen sagt man "Index out of range" - wie man das ordentlich ins Deutsche übersetzen soll, keine Ahnung.



  • Darter schrieb:

    dass ich den Index des Array überlaufe. (so nebenbei, sagt man dass so ? ^^)

    Das Array hat keinen Index, also kannst du ihn auch nicht überlaufen. Du greifst mit dem Index auf das Array zu. Und in diesem Fall überschreitest du den bereich des Arrays.

    theliquidwave schrieb:

    Im englischen sagt man "Index out of range"

    Ich meine, was von "Bereichsüberlauf" oder "Bereichsüberschreitung" im Hinterkopf zu haben.


Anmelden zum Antworten