Http & Socket Problem...



  • Auch nicht das Problem, aber: SendAll macht kein Error-Checking, und das selbe was du bei SendAll machst (in Schleife aufrufen bis alles gesendet wurde) musst du bei recv() auch machen.

    Bzw. eigentlich nur bei recv(), denn send() verschickt bei blocking Sockets immer alles, da kann man sich die Schleife auch sparen. Bei recv() wirst du allerdings definitiv ein Problem bekommen, wenn die Antwort mal etwas grösser wird.



  • @fdfdg das frage ich mich ja auch^^... aber da ist eigentlich nichts zwischengerutscht...

    @HighLigerBiMBam und wo bitte ;)?

    @hustbaer mhh jo ok... aber im moment hab ich halt noch nen viel grösseres problem, als das ich nicht die komplette antwort bekomme^^

    thx mfg



  • GET HTTP 1.1 -> Pfad / fehlt und hier auch HTTP**/**1.1.
    GET / HTTP/1.1 muss es heissen.



  • hey danke deine antwort war echt hilfreich...
    also es lag an folgendem...

    Meine version:

    GET / HTTP 1.1
    

    Und so muss es sein:

    GET / HTTP/1.1
    

    danke bis hier hin 😉 und wenn mir jetzt noch einer sagen könnte wie ich mit großen tcp antworten umgehe bin ich wirklich sehr dankbar 😉

    mfg



  • Http Noob schrieb:

    Hey Leute 😉
    ...naja die grundlagen kann ich aber eigentlich (oop und klassen & syntax etc)...

    Natürlich 😃

    Sieht man auch gut an deinem code.
    Kleines Beispiel:

    Http Noob schrieb:

    string Http::GetSubHost(string sUrl) // Example: 'http://google.de/index.php' -> 'google.de'
    {
        string tUrl;
        string bUrl;
        string Host;
        if(sUrl[0] == 'h' && sUrl[1] == 't' && sUrl[2] == 't' && sUrl[3] == 'p' && sUrl[4] == ':' && sUrl[5] == '/' && sUrl[6] == '/') // Check if starts with 'http://'
        {
            for(unsigned int c = 7; c < sUrl.size(); c++)
            {
                tUrl += sUrl[c];
            }
        }
        else
        {
            tUrl = sUrl;
        }
    
        for(unsigned int c = 0; c < tUrl.size(); c++)
        {
            if(tUrl[c] == '/')
                break;
            Host += tUrl[c];
        }
    
        Http::Host = Host;
    
        return Host;
    }
    

    Alternative:

    std::string trim(const std::string& url) {
    	std::string host(url);
    	if (host.find("http://")==0)
    		host.erase(0,7);
    	return host.substr(0,host.find("/"));
    }
    


  • Sehr schön du schlaumeier^^

    Da ich keine lust hatte mich in die methoden der strings einzulesen hab ichs einfach selfmade erstma gemacht ...



  • Http Noob schrieb:

    und wenn mir jetzt noch einer sagen könnte wie ich mit großen tcp antworten umgehe bin ich wirklich sehr dankbar 😉

    Du musst recv in einer Schleife aufrufen und zwischen 1. Transfer-Encoding: chunked, 2. Content-Length und 3. Simple (gulp) unterscheiden.

    Das wirst du nicht in einem Tag hinkriegen.

    also etwa so:
    recv bis der header komplett ist, dann den header analysieren und dann wie oben angedeutet fortfahren.



  • Das ist doch in dem Artikel gut erklärt:

    http://www.c-plusplus.net/forum/169861



  • @EOP: Connection=Close und Content-Length sind relativ einfach hinzubekommen. Und Transfer-Encoding: chunked muss man ja nicht akzeptieren - gibt ja auch noch HTTP 1.0.



  • naja ihr habt mir mit euren tipps schonmal sehr gehilfen bisher 🙂
    Ich werde da morgen einfach nen bischen rumprobiern werde das schon irgendwie hinbekommen^^

    thx


Anmelden zum Antworten