Wininit
-
Du solltest mal anfangen die Rückgabewerte auszuwerten...
-
Erstens gilt das, was Jochen geschrieben hat. Zweitens ist der Cast zum LPCSTR völlig unnötig, drittens ist der Returnwert ein std::string, der Aufruf von c_str() am Ende ist überflüssig.
Das Schlimmste ist aber:
InternetReadFile(hInternetSiteRequest, antwortbuffer, sizeof antwortbuffer, &len); antwortbuffer[len] = '\0';antwortbuffer[len] kann außerhalb des Arrays liegen -> undefiniertes Verhalten.
Besser:InternetReadFile(hInternetSiteRequest, antwortbuffer, sizeof(antwortbuffer)-1, &len); antwortbuffer[len] = '\0';
-
so hab alles so gemacht wie ihr gesagt hab. nun funzt es auch, wenn ich jetzt dir funktion öfter hintereinander aufrufe dann funzt sie nichtmehr?
-
Ohne Code ist es natürlich schwierig, aber kann es sein, dass du im Fehlerfall returnierst, ohne InternetCloseHandle aufzurufen?
-
Zusatz: Da du mit C++ programmierst, solltest du RAII in Betracht ziehen:
class InternetHandle { public: InternetHandle(HINTERNET hIn) : m_hIn(hIn) {} ~InternetHandle() {InternetCloseHandle(m_hIn);} operator const HINTERNET() const {return m_hIn;} private: HINTERNET m_hIn; }; string http_req(const string& domain, const string& req) // konstante Referenzen, keine Kopien { InternetHandle Internet (InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL)); if(!Internet) { return ""; // kein InternetCloseHandle nötig } .... }
-
die funktion:
string http_req(string req) { HINTERNET hInet = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); HINTERNET hFile = InternetOpenUrl(hInet,req.c_str(),NULL,0,0,0); unsigned long len = 0; std::stringstream CompleteBuffer; CompleteBuffer.clear(); do{ char antwortbuffer[10000] = ""; InternetReadFile(hFile, antwortbuffer, sizeof(antwortbuffer)-1, &len); DWORD er3 = GetLastError(); antwortbuffer[len] = '\0'; CompleteBuffer << antwortbuffer; } while(len); close1: if(InternetCloseHandle(hFile)!=true){ Sleep(1000); goto close1; } close2: if(InternetCloseHandle(hInet)!=true){ Sleep(1000); goto close2; } return CompleteBuffer.str(); }in req/par ist z.b. sowas drin "google.de/index.php?var1=sdfsd&var2=sdfsd"
abrufen tu ich diese funktion in einer while schleife
while (true) { string request = http_req(par); if(request != ""){ //tue etwas } request.clear(); Sleep(x) //warten... }
-
Du wertest immer noch keine Rückgabewerte aus (das heißt nicht nur, die Ausgabe von GetLastError() in eine Variable zu packen - du solltest auch nachsehen, was du dort zurückbekommen hast, und darauf reagieren).
PS: Und die beiden "goto-Schleifen" für die Aufräumarbeiten sind erstens unnötig und sehen zweitens häßlich aus.
PPS: Und du solltest über die RAII-Klasse nachdenken, die Falke vorgeschlagen hat.
-
hab alles ausprobiert aber funktioniert immer noch nicht der 1. in der schleife funktioniert immer aber der 2. nicht da kommt nix am server an....
-
liefern denn die Aufrufe der Intenet...()-Funktionen irgendwelche Fehlerwerte? Wenn ja, wäre das ein Ansatzpunkt zur Lsung des Problems.
-
nein eben nicht, das ist es ja
-
Dann stimmt vielleicht die Adresse nicht, die du angegeben hast. Beobachte doch einmal im Debugger, was dort exakt passiert.
(PS: Woher bekommt die Funktion
httpl_req()eigentlich ihre Daten?
-
die wird von mir vorgegeben
-
Kannst du mal schreiben, was dieser Code im Konsolenfenster ausgibt?
class InternetHandle { public: InternetHandle(HINTERNET hIn) : m_hIn(hIn) {} ~InternetHandle() { DWORD err = GetLastError(); if(err) { cout << "error: " << err << "\n"; SetLastError(0); } InternetCloseHandle(m_hIn); } operator const HINTERNET() const {return m_hIn;} private: HINTERNET m_hIn; }; bool http_req(const string& domain, const string& req, string& output) { SetLastError(0); output.clear(); InternetHandle Internet (InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL)); if(!Internet) return false; InternetHandle InternetSite(InternetConnectA(Internet, domain.c_str(), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, 0)); if(!InternetSite) return false; InternetHandle InternetSiteRequest(HttpOpenRequestA(InternetSite, "GET", req.c_str(), NULL, NULL, NULL, 0, 0)); if(!InternetSiteRequest) return false; if(HttpSendRequestA(InternetSiteRequest, NULL, 0, NULL, 0)) { unsigned long len; do { char antwortbuffer[10000]; if(!InternetReadFile(InternetSiteRequest, antwortbuffer, sizeof(antwortbuffer)-1, &len)) return false; antwortbuffer[len] = '\0'; output += antwortbuffer; } while(len); return true; } return false; } int main() { string s; if(http_req("www.spiegel.de", "", s)) { cout << s.length() << endl; } if(http_req("www.spiegeleiereier.de", "", s)) { cout << s.length() << endl; } }
-
Output:
160887
error: 12007
Drücken Sie eine beliebige Taste . . .
-
würde ich die main so anpassen wie ich sie bräuchte dann würde der error code 32 kommen aber dazu find ich nix
int main() { string s; while(true){ if(http_req("www.spiegel.de", "", s)) { cout << s.length() << endl; } } system("PAUSE"); }
-
Ja also, ersetze
cout << s.length() << endl;durchcout << s << endl;und du wirst den übertragenen Text sehen.
Die Fehlermeldung ist natürlich damit zu erklären, dass der Server "www.spiegeleiereier.de" nicht exisitiert (12000 bis 12174 : ERROR_INTERNET_).Oh Gott, ich sehe gerade deinen letzten Post, für mich ist hier EOD.
-
also folgender code:
#include <string> #include <Windows.h> #include <wininet.h> #include <iostream> using namespace std; class InternetHandle { public: InternetHandle(HINTERNET hIn) : m_hIn(hIn) {} ~InternetHandle() { DWORD err = GetLastError(); if(err) { cout << "error: " << err << "\n"; SetLastError(0); } InternetCloseHandle(m_hIn); } operator const HINTERNET() const {return m_hIn;} private: HINTERNET m_hIn; }; bool http_req(const string& domain, const string& req, string& output) { SetLastError(0); output.clear(); InternetHandle Internet (InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL)); if(!Internet) return false; InternetHandle InternetSite(InternetConnectA(Internet, domain.c_str(), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, 0)); if(!InternetSite) return false; InternetHandle InternetSiteRequest(HttpOpenRequestA(InternetSite, "GET", req.c_str(), NULL, NULL, NULL, 0, 0)); if(!InternetSiteRequest) return false; if(HttpSendRequestA(InternetSiteRequest, NULL, 0, NULL, 0)) { unsigned long len; do { char antwortbuffer[10000]; if(!InternetReadFile(InternetSiteRequest, antwortbuffer, sizeof(antwortbuffer)-1, &len)) return false; antwortbuffer[len] = '\0'; output += antwortbuffer; } while(len); return true; } return false; } int main() { while(true){ string s; if(http_req("www.meinedomain.de.net", "post.php?parm1=sdfsd&parm2=sdfsdf&...", s)) { cout << s.length() << endl; system("PAUSE"); } } }so nun nochmal mein problem, ich stare den debugger und lass mir die länge ausgeben die zu gegin 0 ist. dann change ich was in der php (bzw simuliere damit eine veränderung bei der die php was ausgiebt) und lasse den durch gang nochmal durchlaufen und sehe das die länge immer noch 0 ist?! hab das ganze mal mit ff getestet da gehts also an der php liegts ned
kann mir bitte jm helfen ich hab keinen plan mehr was ich machen soll hab schon alles ausprobiert...!
MFG