Mit C++ PHP Dateien auslesen

L

Lumakrieger

Wie kann ich mit C++ PHP Dateien auslesen?

Hi!

Vorab erst einmal die Bestätigung, dass ich für eine Antwort meiner Frage schon ziemlich viel gegooglt und auch hier im Forum gesucht habe. Jedoch habe ich nichts richtig brauchbares gefunden.
Ich bin noch ein C++ Einsteiger und wäre über eine Vorlage sehr dankbar.

Ich suche ein C++ Skript, das eine PHP-Datei (z.B. http://www.test.de/server.php?befehl=test) aufruft und den String, den server.php ausgibt, in einer Variable speichert. Die PHP-Datei soll nicht angezeigt werden, sondern wirklich nur ausgelesen und gespeichert werden.
Die PHP-Datei könnte z.B. wie folgt aussehen:

PHP:
<?php if($_REQUEST["befehl"] == "test"){echo "ok";} ?>

Ich möchte ein Programm schreiben, was aus Server und Client besteht. Da der Server jedoch anspruchsvoller als der Client wird und da ich PHP im Gegensatz zu C++ einigermaßen gut beherrsche, möchte ich den Serverteil in PHP realisieren. Die Lösung des oben geschilderten Problems ist also von großer Bedeutung für die Kommunikation zwischen Client und Server, welche wiederum essentiell für das Gesamte Programm ist.

Über Vorlagen würde ich mich deshalb sehr freuen und bedanke mich schonmal im Vorraus für Eure Hilfe!

Gruß, lumakrieger
 
Zuletzt bearbeitet von einem Moderator:
Ich kann mir ehrlich gesagt nicht vorstellen das du nichts passendes finden konntest. Ich hatte mal ein ähnliches problem, und , wenn du die Suchfunktion richtig benutzt hättest hättest du auch eine Lösung gefunden.

Schau dir das mal an:

Code:
	HINTERNET hInternet;
        HINTERNET hFile;
        char  Buf[100];
        DWORD ReadSize;
        BOOL  bResult;
        int   nummer = 1;
        char* Befehl[100];    // Hier wird die Ausgegebenen Variablen geschpeichert!


        hInternet = InternetOpen(
            "Beliebige Browserkennung",
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,
            NULL,
            0);

        hFile = InternetOpenUrl(
            hInternet,
            "http://www.beliebige_internetseite.de/datei.php",
            NULL,
            0,
            INTERNET_FLAG_NO_CACHE_WRITE,
            0);

    
        for(;;)
        {
          ReadSize = 1;

          bResult = InternetReadFile(
                hFile,
                Buf,
                1,
                &ReadSize);
            
            if(bResult && (ReadSize == 0))
            break;

            Buf[ReadSize] = '\0';

            if(Buf[0] != '#')
              strcat(befehl[nummer], Buf);
            else
              nummer++;
        }
        InternetCloseHandle(hFile);
        InternetCloseHandle(hInternet);

Das ist ein Codeausschnitt aus einem Programm das ich mal geschrieben habe. Da ich mich sehr beeilt habe ist es etwas umständlich geworden, aber hauptsache es funktioniert!
Das Programm ließt mehrere Variablen aus die in die Variable char* Befehl[100]; geschrieben werden. Das PHP-Script muss dazu lediglich VARIABLE1#Variable2#variable3 ausgeben.

Du kannst dann über


Code:
 hFile = InternetOpenUrl(
            hInternet,
            strcat("http://www.beliebige_internetseite.de/datei.php?befehl=",beliebige_variable),
            NULL,
            0,
            INTERNET_FLAG_NO_CACHE_WRITE,
            0);

eine oder mehrere Variablen übertragen.

Wie gesagt das ist nicht die effizienteste Lösung, man könnte eventuell was weglassen oder ersetzen.
 
Zuletzt bearbeitet:
Danke für die Antwort! Ich probiere es gleich mal aus!

Naja, ich hab hier, in Google und auf diversen anderen Seiten gesucht und nichts gefunden. Naja wahrscheinlich weil ich nicht genau wusste, welche Suchbegriffe ich dafür verwenden söllte. Naja im Zweifelsfall im Forum fragen, das ist immernoch am besten;)
 
Ich hab dazu noch eine Frage:

Was muss ich alles includen, um diese ganzen HINTERNET Funktionen und so benutzen zu können?
 
Also erstmal solltest du dich mit dieser Seite vertraut machen:
http://msdn.microsoft.com/
Den Code den du dort oben siehst habe ich zum größten teil daraus(und den anderen Teil aus dem Forum).

Du müsstest einfach im bereich Visual C++ nach HINTERNET suchen. Dort steht alles was es dazu gibt.

Da der obengenannte Text in ein sehr umfangreiches Programm eingebunden war bin ich mir nicht sicher was alles dazugehörte. Hier mal eine Liste von Dateien die in Frage kommen:

Code:
#include <Wininet.h>
Die bibliothek Wininet.lib

EDIT: auf msdn.microsoft.com steht sehr viel zu den Funktionen! Es gibt SEHR viele Optionen, deshalb solltest du dort mal nachschlagen. Ich habe in meiner Funktion zumbeispiel den Cache deaktiviert(INTERNET_FLAG_NO_CACHE_WRITE). D.h. das die seite immer neugeladen wird. Andernfalls würde immer die selbe seite kommen ganz gleich ob du den PHP-Script änderst oder nicht.
 
Zuletzt bearbeitet:
Mhh, irgendwie kann ich die ganzen Infos bei http://msdn.microsoft.com/ nicht finden. Auch die Suchfunktion hat dort nichts gebracht.

Naja nun zu einem weiteren Problem (ständig stoße ich auf unnötige Fehler in meinem C++ Programm und hab nun schon auf sehr vieles verzichtet):

Hab jetzt mein Clienten soweit fertig, jedoch bleiben im Endspurt noch folgende Fehlermeldungen, wenn ich mein Programm kompilieren möchte:

[Linker error] undefined reference to `InternetOpenA@20'
[Linker error] undefined reference to `InternetOpenUrlA@24'
[Linker error] undefined reference to `InternetReadFile@16'
[Linker error] undefined reference to `InternetCloseHandle@4'
[Linker error] undefined reference to `InternetCloseHandle@4'

(Compiler ist: Dev-C++)

Hier nochmal den Ausschnitt:

Code:
string senden(char* eingabe)
{
string console="";
HINTERNET hInternet;
HINTERNET hFile;
char  Buf[100];
DWORD ReadSize;
BOOL  bResult;
int   nummer = 1;
char* befehl[100];

hInternet = InternetOpen("Beliebige Browserkennung",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
hFile = InternetOpenUrl(hInternet,eingabe,NULL,0,INTERNET_FLAG_NO_CACHE_WRITE,0);
for(;;){
ReadSize = 1;
bResult = InternetReadFile(hFile,Buf,1,&ReadSize);
if(bResult && (ReadSize == 0))
break;
Buf[ReadSize] = '\0';
if(Buf[0] != '#')
strcat(befehl[nummer], Buf);
else
nummer++;
}
InternetCloseHandle(hFile);
InternetCloseHandle(hInternet);

Wer kann mir helfen? Wieso geht das nicht?
Danke im Vorraus für Eure Hilfe!

Gruß, lumakrieger
 
Also mal sehen.

In deiner Funktion finde ich keinen Fehler. Ich habe sie auf meinem PC mit dem selben Compiler wie deinen Compiliert und alles geht.

Wenn du die obengenannten Fehlermeldungen bekommst heißt das, das du die datei wininet.lib nicht eingebunden hast. Wenn ich sie nicht einbinde kommen bei mir die selben Fehler raus wie bei dir.

PS: Also bei Msdn.microsoft.com gibts eigendlich alles:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetopen.asp
Auf der Linken Seite im Index sind auch die Restlichen Funktionen zu sehen die im oberem Programm verwendet wurden. Dort steht auch was man dazu einbinden muss. Eben wininet.lib
 
Hi.

Wenn du Fehler vom Linker über nicht-definierte Referenzen bekommst von Funktionen die du nicht selbst geschrieben hast, bedeutet das meistens das du vergessen hast eine Bibliothek anzugeben in der diese Funktionen enthalten sind.

Für die InternetOpenUrl Funktion benötigt man laut MSDN (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetopenurl.asp) die wininet Bibliothek. Diese mußt du in den Projektoptionen als Linker Parameter eintragen. Die Bibliothek befindet sich unterhalb des Dev-Cpp Verzeichnisses im lib\ Unterverzeichnis und heißt libwininet.a.

Gruß
 
Ah super, danke! Könnte ihr mir grad noch den Befehl sagen wie diese Bibliothek include, hab die üblichen Varianten probiert, die gehen nicht! Bin halt noch ein ! :(
 
Also ich weiß auch nicht wie du eine Bibliothek über den Quelltext aus includest.
Ich weiß nur das man es bei den Link-Parametern dazuschreiben muss:
Code:
cl programm.cpp user32.lib wininet32.lib
Bei deiner Programmierumgebung sollte das glaube ich so gehen:
Project->Settings->Link
Und dann bei
"Object/Library Modules"
einfach wininet.lib dazuschreiben.

Bei anderen Programmierumgebungen geht das meißtens mit "zum Projekt hinzufügen"

EDIT::google:
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück