| Auch mit C/C++ kann man Webserver-(CGI)-Hilfsprogramme erstellen. Ein HTTP-Client (Browser) kann User-Daten an ein CGI-Programm senden, z.B. mit einem HTML-<form> Formular. | Hier wird gezeigt, wie man mit einem CGI-Programm User-Daten empfangen und decodieren kann. |
C/C++ |
Klassiker der modernen Programmiersprachen |
| CGI | Webserver Hilfsprogramme (Common Gateway Interface) |
| GET | CGI-Programm zur Verwendung der GET-Methode des HTTP-Protokolls |
| POST | CGI-Programm zur Verwendung der POST-Methode des HTTP-Protokolls |
| CLI | Commandline Interface (CLI) Argumente, die Variablen argc und argv |
| Funktion getenv() | Standard C/C++ Funktion zum Lesen von Umgebungs-Daten |
| Verwandte Themen | Decodierung von CGI-Daten mit PHP, Javascript |
Webserver-(CGI)-Hilfsprogramme |
|
HTML-Text mit C/C++Die C/C++ Ausbildung beginnt meist mit der Herstellung einfacher Konsolen-Programme. Damit erhält man zwar rasch einige Erfolgs-Erlebnisse, aber spätestens nach ein paar Wochen sind die biederen Konsolen-Programme nur mehr ein spärlicher Lohn für die aufgewendete Mühe.Das Beispiel rechts zeigt, wie einfach die Herstellung einer HTML-Webseite ist: In der C/C++ Programmierung besteht kein Unterschied zu einem Konsolen-Programm. Das Mini-Programm enthält lediglich 4 printf()-Anweisungen, die je 1 Zeile Ausgabe-Text erzeugen. |
Beispiel: C/C++ Programm zur Live-Herstellung einer
HTML-Webseite, z.B. als Datei miniweb.c
#include <stdio.h>
int main() {
printf("Content-Type: text/html;\r\n\r\n");
}
printf("<html>\n"); printf("<h1>Webseite mit C/C++</h1>\n"); printf("<html>\n"); return 0; |
Übersetzung:Man kann die rechts gezeigte Quelltext-Datei miniweb.c mit jedem gängigen C/C++ Compiler in ein ausführbares Programm übersetzen, z.B. mit dem Standard → GNU GCC-Compiler auf Linux# gcc -o miniweb.bin miniweb.c
oder auf Windows
C:\> gcc -o miniweb.exe miniweb.c
|
Das erzeugte Produkt ist nicht portabel: Das Programm miniweb.bin läuft nur auf Linux, das Programm minweb.exe nur auf Windows. Meist ist die Portabilität noch weiter begrenzt, z.B. auf die 32-Bit oder 64-Bit Versionen der Betriebssysteme oder auf bestimmte Versionen / Distributionen. Testen sie das erzeugte Programm daher zuerst an jenem PC, auf dem es compiliert wurde, erst danach auf anderen PC. ♣ Ein Linux-Programm braucht keinen besonderen Datei-Namen, insbesiondere auch keine 'Datei-Erweiterung'. Die Endung *.bin wird hier verwendet, um die Beispiele für Windows-AnwenderInnen verständlich zu machen. |
Arbeits-VerzeichnisKopieren sie die erzeugte Programm-Datei in ein geeignetes Arbeits-Verzeichnis, z.B. auf Linux (hier müssen sie auch die Zugangs-Rechte einstellen, z.B. die Rechte zum Lesen und Ausführen für alle User):
# cp miniweb.bin /home/ich/bin
# chmod 755 miniweb.bin |
oder auf Windows:
# copy miniweb.exe C:\Programme
# chmod 755 miniweb.bin |
CLI-TestMan kann das erzeugte Programm an einer → Konsole (Command-Line Interface CLI) starten. Öffnen sie eine Konsole (Linux-Shell, Linux-Terminal, Windows-Eingabeaufforderung cmd.exe) und starten sie das Programm durch Angabe des gesamten Pfades zur Datei, z.B. auf Linux# /home/ich/bin/miniweb.bin
oder auf Windows
C:\> C:\Programme\miniweb.exe
|
Das Programm sollte an der Konsole diesen Text ausgeben:
Content-Type: text/html;
<html> <h1>Webseite mit C/C++</h1> <html> Das ist - abgesehen von der 1.Zeile - bereits der HTML-Quelltext einer sehr einfachen Webseite. Nun bleibt noch die Aufgabe, diesen Text an einen Browser zu senden, damit dieser die Webseite anzeigen kann. Dazu verwendet man einen ↓ Webserver. |
Ein
→ Webserver ist ein Hintergrund-Programm, welches auf Anfrage Webseiten und
die darin enthaltenen Medien (Bilder...) sendet. Jedes lokale Netzwerk (LAN) sollte u.a.
einen Webserver enthalten, da die meisten Programme der modernen Informatik auf einem
Webserver laufen und am Client-PC nur mehr ein Browser verwendet wird. |
Die Installation des Webservers ist an einem Server-PC sehr wichtig und an jedem Arbeits-PC empfehlenswert, jedoch nicht ganz einfach. ♦ Details zur Installation und Konfiguration des Apache Webservers Alternative: Wenn sie keinen realen Server-PC betreiben, dann können sie an seiner Stelle einen → virtuellen PC als Server verwenden. Man kann fertig konfigurierte virtuelle (LAMP)-Server kostenfrei aus dem Internet laden und am eigenen PC betreiben. ► Voraussetzung für die weiteren ↓ Arbeiten ist, dass der Webserver installiert, konfiguriert und getestet ist. |
CGI Arbeits-VerzeichnisIn der Konfiguration des Webservers ist der Pfad zu einem Arbeits-Verzeichnis für Hilfsprogramme festgelegt.Sie finden dieses Verzeichnis (Ordner) jedoch auch nach seinem Namen, der fast immer auf cgi-bin lautet. |
Kopieren sie das mit dem Compiler erzeugte Programm in das CGI-Verzeichnis des Webservers, z.B. auf Linux (hier müssen sie auch die Zugangs-Rechte zum Lesen und Ausführen einstellen):
# cp miniweb.bin /srv/www/cgi-bin
oder auf Windows
# chmod 755 /srv/www/cgi-bin/miniweb.bin C:\> copy miniweb.exe C:\Web\cgi-bin
|
Browser► Führen sie den ersten Test immer am gleichen PC durch, d.h. an jenem PC, wo das Programm compiliert wurde und an dem der Webserver arbeitet.Starten sie ein Browser-Programm und lassen sie zuerst die Startseite des Webservers anzeigen. Tragen sie diese Web-Adresse in das Adress-Feld des Browsers ein: http://localhost
Wenn das funktioniert, dann ändern sie die Adresse und fordern sie ihr CGI-Programm an, z.B. auf Linux http://localhost/cgi-bin/miniweb.bin
oder auf Windows
http://localhost/cgi-bin/miniweb.exe
|
Live-Anzeige von miniweb.bin ● Ergebnis: Sie haben mit einem C/C++ Programm eine Webseite hergestellt und können diese anzeigen. Das ist noch nicht wirklich spektakulär, aber ein brauchbarer Anfang, den man rasch und einfach weiter-entwickeln kann. Dieses einfache Beispiel zeigt noch nicht das enorme Potential der Methode. |
Netzwerk► Führen sie den gleichen Test in ihrem lokalen Netzwerk aus. Dazu müssen sie den Namen oder die → IP-Adresse des Server-PC angeben. Starten sie am Server-PC eine Konsole und auf Linux eines dieser Programme:
# ip addr show
oder auf Windows das Programm
# ip addr show | grep "inet " # ifconfig # ifconfig | grep "inet " C:\> ipconfig
♦ Details zu den Themen Netzwerk, IP-Adresse |
►
Starten sie an einem beliebigen anderen PC des Netzwerks ein Browser-Programm und
fordern sie zuerst die Startseite, danach das CGI-Programm vom Webserver an,
z.B. von einem Linux-Server
http://192.168.0.1
oder von einem Windows-Server:
http://192.168.0.1/cgi-bin/miniweb.bin
http://192.168.0.1
(ersetzen sie die hier angegebene IP-Adresse durch jene ihres Webserver-PC).http://192.168.0.1/cgi-bin/miniweb.exe ● Ergebnis: Die von ihrem C/C++ Programm erzeugte Webseite wird vom Webserver im gesamten erreichbaren Netzwerk verteilt. Ihr C/C++ Programm braucht daher weder ein grafisches User-Interface noch Programm-Teile zum Transport im Netzwerk. |
Dynamische WebseitenDas C/C++ Programm erzeugt in dieser Minimal-Version immer die gleiche Webseite, d.h. man köM;nnte das gleiche Ergebnis einfacher mit einer Text-Datei miniweb.html erreichen. Der Vorteil eines Programms ist jedoch, dass es variabel ablaufen und - je nach Programmierung - unterschiedliche Ergebnisse (=dynamische Webseiten) liefern kann.Eine einfache Möglichkeit, um das zu demonstrieren ist die Live-Ausgabe von → Datum und Zeit oder von → Zufalls-Daten (z.B. Lotto-Tipp) durch das Programm. Auf dieser Seite wird vorgestellt, wie ein CGI-Programm auf Daten reagieren kann, die vom Client in einer Webseite eingegeben wurden. Die Ausweitung eines Programms zur Herstellung beliebig kompklexer Webseiten sollte danach kein Problem darstellen: Man findet dazu eine unübersehbar große Zahl an Anleitungen und Beispielen, oder man kann mit Rechtklick den Quelltext jeder beliebigen Webseite anseheen und Teile daraus mit C/C++ nachbauen... |
HTML-FormulareMan kann mit Hilfe von → HTML <form>-Elementen Formulare in Webseiten einbetten. Die Formulare können eine beliebige Anzahl von Eingabe-Feldern, Options-Schaltern, Markierungs-Kästchen, Aufklapp-Listen und anderen Bedienungs-Elementen enthalten.Das fertig ausgefüllte Formular wird mit Mausklick abgesendet und von einem eigens dafür hergestellten Empfangs-Programm ausgewertet. Im einfachsten Fall verwendet man das gleiche Programm, um auf einer Webseite mit einem Formular Daten einzuholen, die eingegebenen Daten auszuwerten, und darauf zu reagieren. Auf dieser ↓ Seite werden einige sehr einfache Beispiele dazu vorgestellt. |
Ausblick: Andere dynamische Produkte• Ein C/C++ Programm kann nicht nur - so wie hier vorgestellt - HTML-Text erzeugen sondern beliebige Text-Produkte, die man auf dem gleichen Wege (mit einem Webserver) transportieren und (mit jedem Browser) anzeigen kann, z.B. → SVG Objekt-Grafik, MathML-Formeln usw.• Darüber hinaus kann ein C/C++ Programm auch binäre Daten erzeugen, und damit z.B. Live → Pixel-Grafik oder Audio-Daten erzeugen. |
Ausblick: XMLWenn man gelernt hat, beliebigen Text mit einem CGI-Programm herzustellen, kann man die modernste Methode der Automatisierung probieren:• Das CGI-Programm wird auf die Erzeugung der anzuzeigenden Daten (in XML-kompatibler Form) reduziert. Die Erzeugung des (HTML, SVG, MathML...) Quelltextes wird an ein XSL-Programm ausgelagert. |
GET-Methode |
|
CGI-Programm mit HTTP-GETDas Beispiel rechts demonstriert Live ein C/C++ CGI-Programm.• Tragen sie einen beliebigen Text ein und klicken sie 'Senden'. • Das Programm wird erneut gestartet und erhält dabei die von ihnen eingetragenen Daten. • Die erhaltenen Daten werden im Ausgabe-Text (in stark vereinfachter Form) angezeigt. • Danach wird wieder das Formular angezeigt, damit sie neue Daten eintragen können. ♣ Das Programm cpp_get.bin ist mit einem → HTML <iframe>-Element in diese Webseite eingebettet. Sie können es mit Rechtsklick in einem neuen Tab laden und/oder den vom Programm erzeugten HTML-Quelltext ansehen. |
Live-Demonstration des C/C++ Programms cpp_get.bin |
C/C++ Quelltext• Zunächst werden die 3 Standard-Bibliotheken <stdio.h>, <stdlib.h>, <string.h> eingebunden.• Im Programm main() werden die Variablen len und daten deklariert. • Als erste Ausgabe-Zeile wird die Ankündigung der → MIME-Type gesendet. Das HTTP-Protokoll schreibt vor, dass ein Browser vor den eigentlichen Daten einen Block von Daten (den HTTP-Header) erhält, in dem die nachfolgenden Daten kurz beschrieben werden. Der HTTP-Header wird vom Browser nicht ausgegeben, es gibt jedoch Zusatz-Programme, um auch denn Header auf Wunsch anzuzeigen. • Die nächsten 7 printf()-Anweisungen erzeugen je 1 Zeile gleichbleibenden HTML-Quelltext • Der Wert der → Umgebungs-Variablen QUERYSTRING wird mit Funktion getenv() gelesen und an die String-Variable daten zugewiesen. • Die Text-Länge wird mit Funktion strlen() bestimmt und an die Variable len zugewiesen. • Der QUERYSTRING enthält auch beim Absenden eines leeren Formulars immer die 7 Zeichen txtinp=, d.h. den Namen des Eingabe-Felds, jedoch ohne Daten. Die Auswertung wird daher nur dann durchgeführt, wenn der Text länger ist. AnfängerInnen sollten diese Bedingung weglassen und den erhaltenen QUERYSTRING immer anzeigen. • Wenn auf Grund der Text-Länge len>7 sicher ist, dass Daten übergeben wurden, werden diese ohne weitere Decodierung ausgegeben. Mit der abgeschalteten Zeile //else{} wird angedeutet, wie man optional auf leere Daten reagieren kann. • In jedem Fall wird zuletzt wieder ein leeres Formular erzeugt, mit dem man erneut Daten eingeben kann. |
Inhalt der Text-Datei cpp_get.c |
HTML-QuelltextDiesen Text sehen sie, wenn sie mit RechtsKlick in das Live ausgeführte Programm dessen Quelltext anzeigen lassen. Der Text wird bei jeder einzelnen Ausführung vom Programm erzeugt und an ihren Browser gesendet.• Wenn das Programm Daten im QUERYSTRING erhalten hat, dann werden sie an der bezeichneten Stelle eingefügt. • Im <form>-Element muss man mit dem Attribut method die verwendete Methode angegeben und mit dem Attribut action den Pfad zum Auswertungs-Programm: In diesem Fall ruft sich das Programm beim Absenden selbst auf, es genügt daher die Angabe des eigenen Datei-Namens. • Die traditionelle Methode zum Absenden eines Formulars ist das Einfügen eines <input type="submit">-Elements. Damit wird jedoch immer der Name dieses Elements mit-gesendet, welcher keine sinnvollen Daten enthält. • Besser ist es, zum Absenden ein <button>-Element zu verwenden, das sich allerdings außerhalb des Formulars befinden sollte. Beim Anklicken wird die angegebene Anweisung in der Programmiersprache → Javascript ausgeführt und damit das Formular abgesendet. |
Muster des vom Programm erzeugten Ausgabe-Textes:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head> <title>HTTP-GET mit C/C++</title> </head> <body> <h1>HTTP-GET mit C/C++</h1>
<!-- Erhaltene QUERYSTRING-Daten -->
<form id="f1" name="f1" method="get"
action="cpp_get.bin"><input type="text" name="txtinp" /><br />
<!--<input type="submit" name="Submit"
value="Senden" />-->
</form><button onclick="document.f1.submit()">Senden</button> </body> </html> |
|
● Live-Erzeugung von variablem Text ● Verteilung des Programms im gesamten lokalen Netzwerk ● Ihr Programm kann auf die Anweisungen von Web-BesucherInnen Live (interaktiv) reagieren. |
Diese Aufgaben bleiben noch:• Zerlegung des rohen QUERYSTRING-Textes, um die erhaltenen Daten zu isolieren. • Decodierung, z.B. Übersetzung der URI-codierten Zeichen in verwertbaren Text. Ziffern-Text muss man in den passenden Variablen-Typ umwandeln. ♣ Tipp: Probieren sie bei der Eingabe Leerzeichen, die Zeichen +,?,& oder Umlaute. ♦ Details zum Thema Zeichensatz und URI-Codierung. • Validierung: Nicht immer sind die erhaltenen Daten brauchbar. Ihr Programm muss sinnvoll auf solche Fälle reagieren. |
POST-Methode |
|
CGI-Programm mit HTTP-POSTDas Beispiel rechts demonstriert Live ein C/C++ CGI-Programm.• Tragen sie einen beliebigen Text ein und klicken sie 'Senden'. • Das Programm wird erneut gestartet und erhält dabei die von ihnen eingetragenen Daten. • Die erhaltenen Daten werden im Ausgabe-Text (in stark vereinfachter Form) angezeigt. • Danach wird wieder das Formular angezeigt, damit sie neue Daten eintragen können. ♣ Das Programm cpp_post.bin ist mit einem → HTML <iframe>-Element in diese Webseite eingebettet. Sie können es mit Rechtsklick in einem neuen Tab laden und/oder den vom Programm erzeugten HTML-Quelltext ansehen. |
Live-Demonstration des C/C++ Programms cpp_post.bin |
C/C++ Quelltext• Zunächst werden die Standard-Bibliotheken <stdio.h>, <stdlib.h> eingebunden.• Im Programm main() werden die Variablen len, contlen, daten deklariert. • Als erste Ausgabe-Zeile wird die Ankündigung der → MIME-Type gesendet. Das HTTP-Protokoll schreibt vor, dass ein Browser vor den eigentlichen Daten einen Block von Daten (den HTTP-Header) erhält, in dem die nachfolgenden Daten kurz beschrieben werden. Der HTTP-Header wird vom Browser nicht ausgegeben, es gibt jedoch Zusatz-Programme, um auch denn Header auf Wunsch anzuzeigen. • Die nächsten 7 printf()-Anweisungen erzeugen je 1 Zeile gleichbleibenden HTML-Quelltext • Der Wert der → Umgebungs-Variablen CONTENT_LENGTH wird mit Funktion getenv() gelesen, an die String-Variable contlen zugewiesen, danach mit Funktion sscanf() zu einer ganzen Zahl decodiert und an die Variable len zugewiesen. • Die Input-Daten enthalten auch beim Absenden eines leeren Formulars immer die 7 Zeichen txtinp=, d.h. den Namen des Eingabe-Felds, jedoch ohne Daten. Die Auswertung wird daher nur dann durchgeführt, wenn der Text länger ist. • Wenn auf Grund der Text-Länge len>7 sicher ist, dass Daten übergeben wurden, werden diese mit Funktion fgets() vom Standard Input-Kanal stdin gelesen. Dieser Kanal entspricht der Tastatur-Eingabe an einer Konsole und wird von der POST-Methode zum Transport der Daten verwendet. Danach werden die Daten ohne weitere Decodierung ausgegeben. • Zur Vereinfachung wird hier die Länge der Daten nicht begrenzt. Man muss dafür sorgen, dass die Länge der String-Variablen daten nicht überschritten wird. • In jedem Fall wird zuletzt wieder ein leeres Formular erzeugt, mit dem man erneut Daten eingeben kann. |
Inhalt der Text-Datei cpp_post.c |
HTML-QuelltextDiesen Text sehen sie, wenn sie mit RechtsKlick in das Live ausgeführte Programm dessen Quelltext anzeigen lassen. Der Text wird bei jeder einzelnen Ausführung vom Programm erzeugt und an ihren Browser gesendet.• Wenn das Programm Daten im INPUT-Kanal erhalten hat, dann werden sie an der bezeichneten Stelle eingefügt. • Im <form>-Element muss man mit dem Attribut method die verwendete Methode angegeben und mit dem Attribut action den Pfad zum Auswertungs-Programm: In diesem Fall ruft sich das Programm beim Absenden selbst auf, es genügt daher die Angabe des eigenen Datei-Namens. • Die traditionelle Methode zum Absenden eines Formulars ist das Einfügen eines <input type="submit">-Elements. Damit wird jedoch immer der Name dieses Elements mit-gesendet, welcher keine sinnvollen Daten enthält. • Besser ist es, zum Absenden ein <button>-Element zu verwenden, das sich allerdings außerhalb des Formulars befinden sollte. Beim Anklicken wird die angegebene Anweisung in der Programmiersprache → Javascript ausgeführt und damit das Formular abgesendet. |
Muster des vom Programm erzeugten Ausgabe-Textes:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head> <title>HTTP-POST mit C/C++</title> </head> <body> <h1>HTTP-POST mit C/C++</h1>
<!-- Erhaltene INPUT-Daten -->
<form id="f1" name="f1" method="post"
action="cpp_post.bin"><input type="text" name="txtinp" /><br />
<!--<input type="submit" name="Submit"
value="Senden" />-->
</form><button onclick="document.f1.submit()">Senden</button> </body> </html> |
Die verbleibenden Aufgaben sind die gleichen wie beim oben vorgestellten Muster der
↑ GET-Methode:• Zerlegung des rohen INPUT-Textes, um die erhaltenen Daten zu isolieren. • Decodierung und Umwandlung in den passenden Variablen-Typ. • Validierung und Reaktion auf unbrauchbare Daten. |
Unterschiede zur ↑ GET-Methode• Die übergebenen Daten erscheinen nicht in der Adresszeile des Browsers. Das bietet etwas mehr Sicherheit gegen das unerwünschte Abhören der Daten.• Mit der GET-Methode sollte der gesamte gesendete Text (=die Browser-Adress-Zeile) nicht mehr als 500, maximal 1000 Byte umfassen. Diese Grenze ist von HTML-Version, Server- und Browser-Typ abhängig. • Mit der POST-Methode kann man praktisch beliebig viele Daten übertragen. |
|
Letzte Änderung dieser Seite: 2012-04-30 13:08:49
|