http Request



  • ...



  • Frag mich nicht wo, aber es geht. Habe das nochmal in einem neuen Projekt aus der letzten Sicherungskopie gemacht.

    Verbindung erfolgreich hergestellt!

    Empfange Daten...

    Fehler beim Auslesen

    Kann man irgendwie das ausarbeiten wo der Fehler liegt?

    wenn ich die host und url in den Browser eingebe, dann bekomme ich das richtig angezeigt.



  • ...



  • Swordfish schrieb:

    😕

    MarcusMK schrieb:

    Frag mich nicht wo, [...]

    Da:

    MarcusMK schrieb:

    catch(exception& e) {
    

    Ich meinte mit frag mich nicht wo eigentlich, dass ich das ich ein neues Projekt aufgemacht habe und die zuvorige Kopie verwendet habe. Der Fehler zuvor damit behoben war.

    Ich bin gerade im Zug. Werde mir das heute Abend nochmal ansehen.



  • Hallo,

    ich komme leider nicht weiter....

    #include<iostream>
    #include<fstream>
    #include<sstream>
    #include<conio.h>
    #include<string.h>
    #include<cstring>
    #include<stdexcept>     
    #include<winsock2.h> 
    
    using namespace std;
    
    std::runtime_error CreateSocketError() {
    ostringstream temp;
        int error = WSAGetLastError();
        temp << "Socket-Fehler #" << error;
        char* msg;
        if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                         NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                         reinterpret_cast<char*>(&msg), 0, NULL))
        {
            try {
                temp << ": " << msg;
                LocalFree(msg);
            }
            catch(...) {
                LocalFree(msg);
                throw;
            }
        }
        return runtime_error(temp.str());
    }
    
    void SendAll(int socket, const char* const buf, const int size) {
        int bytesSent = 0;
        do {
            int result = send(socket, buf + bytesSent, size - bytesSent, 0);
            if(result < 0)
                throw CreateSocketError();
            bytesSent += result;
        } while(bytesSent < size);
    }
    
    bool GetLine(int socket, stringstream& line) {
        for(char c; recv(socket, &c, 1, 0) > 0; line << c)
            if(c == '\n')
                return true;
        return false;
     //  throw CreateSocketError();
    }
    
    string httpRequest(string host, string msg) {
        WSADATA w;
        if(int result = WSAStartup(MAKEWORD(2,2), &w) != 0) {
            cout << "Winsock 2 konnte nicht gestartet werden! Error #" << result << endl;
            return "";
        }
    
        hostent* phe = gethostbyname(host.c_str());
    
        int Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(Socket == -1) {
            cout << "Socket konnte nicht erstellt werden!" << endl;
            return "";
        }
        sockaddr_in service;
        service.sin_family = AF_INET;
        service.sin_port = htons(80);
    
        char** p = phe->h_addr_list;
        int result;
        do {
            if(*p == NULL) {
                cout << "Verbindung fehlgschlagen!" << endl;
                return "";
            }
            service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p);
            ++p;
            result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
        }
        while(result == -1);
        cout << "Verbindung erfolgreich hergestellt!" << endl;
    
        const string request = "GET " + msg + " HTTP/1.1\r\nHost: "+host+"\r\nConnection: close\r\n\r\n";
        SendAll(Socket, request.c_str(), request.size());
    
        cout << "Empfange Daten..." << endl;
        string var_von_php;  
        for(int i=0; i<17; i++) {
                stringstream line;
                try {
                    GetLine(Socket, line);
                }
                catch(exception& e) {
                   cout << "Fehler beim Auslesen";
                }
               if(i==16)
                   var_von_php = line.str();
        }
        closesocket(Socket);
    	cout << "Close Socket";
        return var_von_php;
    
    }
    
    void var_ausgeben(string var_von_php, string host, string url){
    
    	cout << var_von_php << endl << endl;
    	cout << host;
    	cout << url << endl;
    
    	system ("pause");
    }
    
    int main()
    {
    
    string host = "www.domain.de";
    string url = "/main/cpp.php";
    
        string var_von_php = httpRequest(host,url);
        var_von_php = var_von_php.substr(0,var_von_php.length()-1);
    
            var_ausgeben(var_von_php, host, url);
    
        return 0;
    }
    

    Die Daten werden nciht von der PHP geholt. Bringt mir allerdings auch keinen Fehler aus.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nur mal als Info:
    Es gibt auch InternetOpenUrl und HttpSendRequest, welches Dir eigentlich die ganze Arbeit abnimmt...



  • OK, gibt es dazu auch ein passendes Beispiel?





  • Wenn ich den Code im Beispiel 1 zu 1 übernehme, dann wird mir unter anderem

    InternetOpen
    InternetConnect
    HttpOpenRequest

    rot markiert, brauche dazu noch irgendwelche libs?



  • MarcusMK schrieb:

    Wenn ich den Code im Beispiel 1 zu 1 übernehme, dann wird mir unter anderem

    InternetOpen
    InternetConnect
    HttpOpenRequest

    rot markiert, brauche dazu noch irgendwelche libs?

    Warscheinlich ja, deine Fehlerbeschreibung ist so detailreich da Blick ich leider nicht mehr durch. 😮

    Ne im Ernst poste mal die GENAU Fehlermeldung.

    Du brauchst für die Funktionen:
    Wininet.lib
    Wininet.dll

    Dokumentation zu alle WinInet Funktionen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa385473(v=vs.85).aspx



  • Woher bekomme ich die lib und dll?



  • Die lib ist bei Visual Studio dabei, kansst du mit #pragma comment(lib, "WinInet.lib") inkludieren, und die WinInet.dll ist die dazugehörige dll die im System vorhanden ist, mit der must du eigentlich nicht's machen.



  • Hallo,

    ich habe gerade den Code genommen

    int main(){
    HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
    
       if(!connect){
          cout<<"Connection Failed or Syntax error";
          return 0;
       }
    
    HINTERNET OpenAddress = InternetOpenUrl(connect,"http://www.url.de/ip/read.php", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
    
       if ( !OpenAddress )
       {
          DWORD ErrorNum = GetLastError();
          cout<<"Failed to open URL \nError No: "<<ErrorNum;
          InternetCloseHandle(connect);
          return 0;
       }
    
       char DataReceived[4096];
       DWORD NumberOfBytesRead = 0;
       while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
       {
               cout << DataReceived;
       }
    
       InternetCloseHandle(OpenAddress);
       InternetCloseHandle(connect);
    
       ofstream datei;
    datei.open("datei.txt");
    datei << DataReceived
    
    cout << "Eingaben gespeichert." << endl;
       system("PAUSE");
    }
    

    Wenn ich den Ausführe, wird mir das PHP zwar ausgelesen, aber es kommen noch irgendwelche Zeichen dazu.

    0
    
    intragrag
    
    ÌÌÌÌÌÌ
    

    Habe die Ausgabe etwas gekürzt, da stehen gefühlt 1000 mal das Ì

    Wenn ich das PHP direkt auslese uber Firefox, dann kommt bei mir nur testeintrag



  • Verwende mal einen Nullterminator.

    Also so:

    while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
       {
           DataReceived[NumberOfBytesRead]='\x00'; 
           cout << DataReceived;
       }
    

    MarcusMK schrieb:

    Wenn ich das PHP direkt auslese uber Firefox, dann kommt bei mir nur testeintrag

    Sieht deine PHP Datei in etwa so aus:

    <?php
    echo "testeintrag";
    ?>
    

    Eine PHP Datei kann man nicht einfach so wie eine HTML Datei von einem Webserver auslesen. Das hat auch so seine Gründe ...

    <?php
    $SuperMegaPasswort = $_POST["data"];
    
      if ( $SuperMegaPasswort == "SUPER GEHEIMES PASSWORT" )
      {
         // Zeige Bill Gates Bankkonto Daten 
      }
    ?>
    

    Das würde der Bill gar nicht lustig finden.^^ Du könntest ja sonst an seine Bankdaten kommen. 😃



  • Hallo,

    Dank Dir erstmal...

    Das PHP sollte auch nur zum testen so sein.

    Habe das aber mal so gemacht.

    <?php
    $SuperMegaPasswort = $_GET["data"];
    
      if ( $SuperMegaPasswort == "SUPER_GEHEIMES_PASSWORT" )
      {
          echo "testeintrag";
      }
    ?>
    

    Dann führe ich das mit dem Programm auf

    read.php?data=SUPER_GEHEIMES_PASSWORT

    Das klappt soweit auch, nur wird mir folgendes in datei.txt gespeichert.

    0

    intrag



  • #include <windows>
    #include <Wininet.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
    
    HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
    
       if(!connect){
          cout<<"Connection Failed or Syntax error";
          return 0;
       }
    
    HINTERNET OpenAddress = InternetOpenUrl(connect,"http://127.0.0.1/index.php?data=SUPER_GEHEIMES_PASSWORT", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
    
       if ( !OpenAddress )
       {
          DWORD ErrorNum = GetLastError();
          cout<<"Failed to open URL \nError No: "<<ErrorNum;
          InternetCloseHandle(connect);
          return 0;
       }
    
       char DataReceived[4096];
       DWORD NumberOfBytesRead = 0;
    
       while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
       {
               DataReceived[NumberOfBytesRead]='\x00';
               cout << DataReceived;
       }
    
       ofstream datei;
       datei.open("datei.txt");
       datei << DataReceived;
    
    system("PAUSE");
    }
    

    Funktioniert bei mir ohne Probleme.

    Aber bis du dir sicher das es nötig ist InternetReadFile in einer Schleife auszuführen? Regelt die Funktion das nicht intern selber das alle Bytes ausgelesen werden? (Naja, egal hab gerade kb iner Doku nachzuschauen.^^)



  • Hallo,

    bei mir geht es irgendwie nicht. Ich bin ratlos... Würdest du mir einen Gefallen tun und dir das bei mir ansehen?

    http://www.file-upload.net/download7293697/neu.rar.html



  • Ich hab deine Exe da drin nicht geöffnet sondern nur eben im OllyDebugger geschaut von welcher Seite du das da versuchst. (Ich zensier mal deinen Nachnamen). Beim Quelltext hattest du ja nur irgendwas mit example reingeschrieben daher wusste ich nicht von welcher Internetseite du die Datei auslesen wolltest.

    0041F970=neu.0041F970 (ASCII "http://www.sebastian-ZENSIERT.de/ip/iplog/read.php?data=SUPER_GEHEIMES_PASSWORT")
    

    Aber schau mal hier: <title>401 Authorization Required</title>

    Das erklärt wohl warum es nicht geht ...

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>401 Authorization Required</title>
    </head><body>
    <h1>Authorization Required</h1>
    <p>This server could not verify that you
    are authorized to access the document
    requested.  Either you supplied the wrong
    credentials (e.g., bad password), or your
    browser doesn't understand how to supply
    the credentials required.</p>
    <hr>
    <address>Apache/2.2.22 Server at www.sebastian-ZENSIERT.de Port 80</address>
    </body></html>
    Drücken Sie eine beliebige Taste . . .
    

    Schmeiss deine PHP Datei mal in ein Verzeichniss wo jeder Zugriff drauf hat ansonsten authentifizier dich einfach. Ka ob es jetzt eine WIN API Funktion für gibt ansonsten bau das selber mit Sockets nach.



  • Hallo,

    habe die htaccess wieder rausgenommen. Mache die auf gewisse Ordner immer rein. Hatte die reingemischt, da ich aus dem Haus bin.


Anmelden zum Antworten