http Request
-
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
HttpOpenRequestrot 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
HttpOpenRequestrot 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.dllDokumentation 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?
-
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.
-
Aber auch ohne htaccess geht es nicht.
-
Bassmaster schrieb:
Eine PHP Datei kann man nicht einfach so wie eine HTML Datei von einem Webserver auslesen. Das hat auch so seine Gründe ...
Ja, ja das ist ziemlich ärgerlich. Würde meine Arbeit sehr vereinfachen wenn es anders wäre...
-
hast du es nochmal versucht? Ich habe das heute den ganzen Tag im Internet danach gescuht, aber finde dazu leider keine Lösung.
Ich bekomme noch immer diese Ausgabe.