C++ HTTP Aufruf, welche Möglichkeiten?
-
Hey,
ich suche eine Möglichkeit über ein C++ Programm ein PHP Script aufzurufen welches einträge in eine Datenbank vornimmt. Zur Zeit benutze ich noch ShellexecuteA.char buffer[50]; sprintf (buffer, "http://x.de/test.php?name=%s&value=%d", name,value); ShellExecuteA(NULL, "open", buffer,NULL , NULL, SW_SHOWNORMAL);
Funktioniert auch soweit. Es nervt mich aber das ich den Browser dazu brauche und habe gelesen das man es auch ohne externes Programm lösen kann (quasi unsichtbar).
Könnt ihr mir sagen welche Möglichkeiten ich da habe?Gruß
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) 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.
-
-
Das geht mit der Standard WIN API, Stichwort: winsock
Falls du keine Lust hast soviel selber zu basteln dann wäre curl wohl das richtige. (siehe Beitrag über meinem)
Aber wenn dich interessiert wie der ganze Kram wirklich funktioniert dann würde ich an deiner Stelle die WIN API verwenden.
Hier ein paar Links:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspxhttp://www.c-worker.ch/tuts.php
Weitere Stichwörter:
- HTTP post request
- HTTP get request
- RFC (Dokumentation, z.b. über das HTTP Protokoll)
- Wireshark (Netzwerk sniffer, damit kannst du gut sehen wie deine Browser z.b. requests versendet.)
- Für Firefox gibt es auch Plugins die ebenfalls sowas können jedoch sieht man da nichts von dem \r\n
- Das Firefox Plugin heisst: Live HTTP Headers (oder das Plugin Tamper Data das kann man auch verwenden ich finde aber Live HTTP Headers besser.)Noch ein Hinweis meiner Seits:
string myRequest = "GET / HTTP/1.1\r\n" "Host: www.google.de\r\n" "Connection: keep-alive\r\n" "\r\n";
Am Ende nicht das \r\n vergessen.
Jetzt weiss du schonmal wie z.b. ein Request aussieht der muss nun nur noch versendet werden.
Wenn ich z.b. einfach in Firefox www.google.de eingeben und Enter drücke dann sendet mein Browser folgendes an Google.
GET / HTTP/1.1 Host: www.google.de User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: PREF=ID=f2c68ed6249255ec:U=7506451b5db5c56a:FF=0:TM=1367829182:LM=1368171722:S=kqd9e4bUL2FS-ZHz; NID=67=XL3z6crCK1cVnrerr4_4RTgmzA8KN8Q0HMO4jr6dKF3XVLnQIh9hmWzru_JoLCbpwIxCTUeSbhmFdro-35Ll6sWkX7iktlsMgPZEZSQoKgOEAqO-do5ksJbpBxTK-J-x Connection: keep-alive
Wie du siehst hab ich in meinem Request oben ein paar Felder ausgelassen die nicht unbedingt benötigt werden. (Ziel soll es sein eine Fehlerfreie Antwort von Google zu erhalten. Für mehr Informationen bezüglich der Felder schau einfach in die RFC´s.)
Die Antwort von Google sieht so aus:
HTTP/1.0 200 OK Date: Wed, 22 May 2013 13:19:58 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Server: gws X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN X-Cache: MISS from Firewall Via: 1.0 Firewall:10080 (squid) Proxy-Connection: close
-
Bassmaster schrieb:
Das geht mit der Standard WIN API, Stichwort: winsock
Wenn man nicht ganz Low Level arbeiten will gibt es auch das hier
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385473%28v=vs.85%29.aspxHier ist die Gesamtübersicht der Netzwerk-APIs
http://msdn.microsoft.com/en-us/library/windows/desktop/ee663286%28v=vs.85%29.aspx
-
Anderer Vorschlag: verwende
wget
.http://gnuwin32.sourceforge.net/packages/wget.htm
Das ist zwar nicht "ohne externes Programm", aber da
wget
ein Command-Line Utility ist, und man die auch ohne sichtbare Konsole laufen lassen kann trotzdem "unsichtbar".Und einfacher als es mit einer HTTP Library zu machen.
-
vielen Dank für eure Antworten.
Ich werds dann wohl mal mit Winsocks ausprobieren ;).Gruß
-
Also, bevor Du Dich mit WinSock rumärgerst, nimm lieber was fertiges:
Z.B. InternetOpenUrl
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098Besser ist noch WinHTTP:
z.B.: WinHttpConnect
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384091
-
hm ok, danke.
schau mir das auch mal an.noch eine sache bei meinem Code:
char buffer[50]; printf("Name= %s",name); sprintf (buffer, "http://x.de/test.php?name=%s&value=%d", name,value); ShellExecuteA(NULL, "open", buffer,NULL , NULL, SW_SHOWNORMAL);
in Zeile 2 wird der Name immer richtig angezeigt.
Bei Zeile 3 steht dann aber plötzlich "|î" als Name, manchmal
aber auch der richtige Name.
Wie kann das passieren?
-
Weil du dir den Stack zerschiesst.
So wie du sprintf verwendest ist es halt nicht safe. Und 50 Bytes sind nicht so üppig viel wenn dein Format-String (exklusive Formatierungszeichen) schon 34 Zeichen lang ist...
-
wenn ich mich richtig erinnere, so sollte gehen:
ShellExecuteA(NULL, "open", "http://x.de/test.php?name=%s&value=%d", NULL , NULL, SW_HIDE);
ansonsten siehe Vorschlag von Jochen Kalmbach.