Text auf Website auslesen?



  • #include <stdio.h>
    #include <WinSock2.h>
    
    #pragma comment (lib, "Ws2_32.lib")
    
    // Rückgabewerte sind eh lame ;)
    int main()
    {
      WSADATA wsadata;
      int sock;
      struct sockaddr_in addr = {0};
      struct hostent* host;
      char buf[100];
      char request_dummy[] = 
        "GET / HTTP/1.0\r\n"
        "Host: %s \r\n"
        "\r\n";
      char request[256];
    
      printf("Server: ");
      fgets(buf, sizeof(buf), stdin);
      buf[strlen(buf) - 1] = 0;
      WSAStartup(WINSOCK_VERSION, &wsadata);
      host = gethostbyname(buf);
      if (!host)
      {
        printf("Could not find host: %s\n", buf);
        return 1;
      }
      addr.sin_addr = *(struct in_addr*)host->h_addr;
      addr.sin_family = PF_INET;
      addr.sin_port = htons(80);
      sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      connect(sock, (struct sockaddr*)&addr, sizeof(addr));
      sprintf(request, request_dummy, buf);
      send(sock, request, strlen(request), 0);
    
      while (1)
      {
        int rval = recv(sock, buf, sizeof(buf) - 1, 0);
        if (rval <= 0)
          break;
        buf[rval] = 0;
        printf("%s", buf);
      }
    
      closesocket(sock);
      WSACleanup();
      getchar(); // blah
      return 0;
    }
    

    Da! Nix libcurl 😃



  • Naja, wollte so ne Klasse eh mal basteln für meine kleine Headersammlung und bin mal nicht so. Ausserdem war mir langwelig :D.

    // Author: Scorcher24
    // License: Public Domain
    // Purpose: Easy download of a small document from any http-server.
    
    #include <curl/curl.h>
    #include <curl/easy.h>
    #include <string>
    
    #ifdef _MSC_VER
    #pragma comment(lib, "libcurl_imp.lib")
    #else
    #warning "Don't forget to link to libcurl. Autolink not possible!"
    #endif /* _MSC_VER */
    
    namespace Internet{
    
    class EasyCurl
    {
    public:
        bool downloadFile(const std::string& url)
        {
            CURL* curl = curl_easy_init();
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &EasyCurl::callback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
            if ( curl_easy_perform(curl) != CURLE_OK ) 
            {
                return false;
            }
            curl_easy_cleanup(curl);    
            return true;
        }
    
        const std::string& getResult() const { return m_lastResult; }
    
    private:
    
        static size_t callback( void *ptr, size_t size, size_t nmemb, void *user)
        {
            if ( user != NULL )
            {
                EasyCurl* p = static_cast<EasyCurl*>(user);
                if ( p )
                {
                    p->setResult(static_cast<const char*>(ptr));
                }
            }
            return size*nmemb;
        }
    
        void setResult(const char* r)
        {
            m_lastResult += std::string(r);
        }
    
    private:
        std::string m_lastResult;
    };
    
    } // Namespace
    

    Verwendung:

    #include "EasyCurl.hpp"
    #include <iostream>
    using namespace std;
    
    int main(int argc, char** argv) 
    {
        if ( argv[1] == NULL )
        {
            std::cout << "Usage: easycurl url" << std::endl;
            return -1;
        }
        Internet::EasyCurl c;
        c.downloadFile(argv[1]);
        std::cout << c.getResult();
        return 0;
    }
    

    Ein vorkompiliertes libcurl hab ich dir hier hochgeladen:
    http://www3.zippyshare.com/v/41773400/file.html

    Viel Spaß damit.

    edit: Nen kleinen glitch korrigiert



  • Ok, jetzt wirds peinlich @Sorcher24 viiiiielen Dank für den Code. Jedoch geht es einfach nicht. Schau dir das mal an: http://s7.directupload.net/images/110326/jihgo87m.png was bitte ist das falsch warum kann ich die header datei nicht includen?

    Danke



  • Liegt die im selben Ordner wie die main.cpp?
    Und hast du auch libcurl eingebunden, sprich include und libpfad in deine Projekteinstellungen?
    Und sorry, das solltest du echt lernen. Was includes genau sind und wie man sie einbindet etc.

    Ach btw, mein libcurl ist nur für Visual Studio 2008 gebaut, nicht sicher ob der 2010er das verwenden kann. Denke eher nicht.

    edit:
    Moment, du willst nen Flashplayer bauen? 😮
    Eh, so funktioniert das aber nicht guter Mann.



  • 😃 nein ich will keinen FlashPlayer bauen das wars falsche Projekt 😃 sry



  • Wie gesagt, für meine Version musste nichts mehr includen 😃



  • cooky451 schrieb:

    Wie gesagt, für meine Version musste nichts mehr includen 😃

    Willst du dich jetzt streiten wessen Hilfe besser ist oder was? 🤡



  • ok. Ich werd sie mal versuchen aber @Scorcher24 jetzt kommen noch diese Fehler und wie krieg ich die Weg?? Ich kriegs nich hin. http://s7.directupload.net/images/110326/g3mrkgmu.png und mit dem FlashPlayer da hat ich mal nen Code von ner Website welcher mir zu kompliziert wurde und dewegen hab ich aufgehört :D.



  • Wie ich bereits sagte, du musst deinen include und lib pfad auf libcurl setzen bzw einfügen. Entweder global oder im projekt.
    http://msdn.microsoft.com/en-us/library/t9az1d21.aspx



  • Scorcher24 schrieb:

    cooky451 schrieb:

    Wie gesagt, für meine Version musste nichts mehr includen 😃

    Willst du dich jetzt streiten wessen Hilfe besser ist oder was? 🤡

    Ich denke das können wir abkürzen:
    Deine Version hat mit Sicherheit Vorzüge, (meine ist ja auch in 3 Minuten hingeklatscht^^) aber ich verstehe nicht warum man für ein so simples Problem, dass sich in ein paar Zeilen Code locker lösen lässt, gleich libcurl oder sowas nutzen muss. Gut, wir sind im C++ Forum, aber irgendwie ist libcurl wohl auch kein Standard-C++.



  • libcurl sorgt dafür, dass du dich nicht mit dem http-protokoll rumschlagen musst.
    Das ist der riesen Vorteil daran.
    Aber mein Einwurf war eher humoristischer Natur.



  • Yey, wir haben

    char request_dummy[] =
        "GET / HTTP/1.0\r\n"
        "Host: %s \r\n"
        "\r\n";
    

    Übersprungen!
    Ich denke es ist klar, dass ich hier die eindeutig coolere "unbeholfenem TE Code posten den er wahrsceinlich eh nur mit Copy&Paste verwenden kann" Hilfestellung gegeben habe, da bei mir wirklich nur Copy&Pase nötig ist! 😃



  • Halbgare Eigenimplementationen sind nicht cool 😛



  • @Scorcher24 ja, aber die funktion gibt es in 2010 nicht mehr: http://s1.directupload.net/images/110326/bn3xlu3u.png



  • Man kann es in 2010 trotzdem einstellen. Ansicht -> Weitere Fenster -> Eigenschaften-Manager. Dort die Mappe deines Projektes öffnen und Rechtsklicken auf Microsoft.CPP.Win32.User (oder so ähnlich) Dann kannst du dort für alle Projekte die Einstellungen für Release und Debug vornehmen.



  • das gibt's da nicht.



  • man. Beide Versionen von euch gehen nicht. Bei Scorcher24 kommen die Fehler und bei cooky451 kommt immer Could not find host: schade das keiner weiß wies funktioniert. Aber trotzdem Danke euch für die Mühe.

    LG



  • sry. cooky deine Version geht!!! VIEEEEEEEEEEEEEEEEEEEEEEEEEEEEEELEN Dank



  • iMüll schrieb:

    man. Beide Versionen von euch gehen nicht. Bei Scorcher24 kommen die Fehler und bei cooky451 kommt immer Could not find host: schade das keiner weiß wies funktioniert. Aber trotzdem Danke euch für die Mühe.

    LG

    Ehm ja.
    Meine Lösung würde auch bei Dir funktionieren wenn du nur grundlegend Ahnung hättest wie man eine Library einbindet oder auch nur annähernd mal nen Buch gelesen hättest.

    Es kompiliert und es funktioniert:
    http://h-2.abload.de/img/ahnungub0b.png

    Eventuell solltest du nicht Visual Studio Team Edition hernehmen wenn du nicht damit umgehen kannst. Die Urhberrechtsverletzung hättest dir sparen können.
    Nimm mal das hier:
    http://codelite.org/
    Weit einfacher zu verwenden.
    Runterladen, installieren und dann bitte erstmal rtfm.



  • @cooky wie kann ich an dieser Stelle:

    fgets(buf, sizeof(buf), stdin);
    

    statt fgets schon etwas zuweisen? Also nicht fgets sondern c-plusplus.net z.B.

    Danke


Anmelden zum Antworten