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).aspx

    http://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.aspx

    Hier 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/aa385098

    Besser 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.


Log in to reply