Das cgi - common gateway interface - mit der Sprache C nutzen

Warum mit der Sprache C auf einem Webserver arbeiten, um mit Webusern zu interagieren?

Es gibt doch javascript, php und und und …

Ich habe hier einmal beschrieben, wie ich das Problem gelöst habe. Es wird sicherlich effizientere Ansätze geben, aber dies ist mein Weg gewesen, mich dem Problem zu nähern.

Auslöser

Unsere große Toilette im ersten Stock ist gerne von der Brut in Beschlag genommen, weil sich Teenager gerne auch etwas länger aufhübschen als Senioren, wo es laut der Brut keinen Wert mehr hat.

Von Aussen sieht man wenn die Toilette belegt ist (rotes Feld unter der Klinke), aber erst wenn ich vor der Tür stehe. Natürlich nicht aus dem Garten, von der Terasse oder aus dem Wohnzimmer…

Idee

Daher folgende Idee: Jeder der Hausbewohner führt ein Smartphone bei sich. Warum nicht eine kleine Webseite aufbauen, die den Status des WC im 1. OG anzeigt und auf der man den Status durch einfaches anklicken ändern kann?

Dies war also die Grundidee.

Lösungsansatz

Da ich keine Ahnung von javascript, php und ähnlichem habe und viele dieses auch in ihren Browsern aus Sicherheitsgründen deaktiviert haben, musste eine serverbasierte Lösung her.

Ich hatte Anfang der 90-er des letzten Jahrtausends mal beim Einarbeiten in die serverseitige www-Welt etwas vom cgi, common gateway interface, gehört/gelesen, das dem Austausch zwischen Server und (evtl. eigener) Software dient.

Da ich die Sprache C mag und das Problem schnell gelöst werden soll, hier nun meine laienhafte Vorgehensweise zur Problemlösung, eine solche Software mit C zu erstellen.

Erster Test

Aller Anfang ist schwer.

Daher besser erst einmal ein kleines Problem lösen, nämlich:

  • wo lege ich die auszuführende Datei ab?
  • läuft mein Kompilat auf dem gemieteten und mit vielen Usern geteilten Webspace?
  • wie muss ich Meldungen/Daten formatieren, damit sie sauber im Browser angezeigt werden können?

Fragen über Fragen, die ich nur durch Versuche lösen kann.

Hier mein erstes kleines Test-Programm, das lediglich die Meldung “Hallo Welt!” im Browser-Fenster ausgeben soll, wenn man das Programm per Webbrowser aufruft.

Wichtig ist der erste printf-Befehl

printf("Content-Type: text/plain;charset=us-ascii\n\n");,

der dem Browser den Inhaltstyp mitteilt. Dann klappts auch mit dem vorbeisurfenden Nachbarn.

//cgi-script in c 
// cgi_test_01

#include <stdio.h> 

#include <stdlib.h> 

int main()

{

    printf("Content-Type: text/plain;charset=us-ascii\n\n");  // Wichtig! Nicht vergessen!

    printf("Hallo Welt!\n");

    return 0;

}

Diesen Quelltext mit dem gcc kompilieren und eine ausführbare Datei erzeugen lassen.

Das Programm gehört per scp auf den Server übertragen und zwar im Falle von Uberspace als Hoster nach:

[Dein Servername oder -IP]:/home/[Dein Username]/cgi-bin/[Deine Software]

Anschliessend sollte man sich per ssh auf seinen Webspace aufschalten und seiner Software per

chmod 755 ./[Deine Software]

die passenden Rechte geben, damit Webuser die Software auch nutzen dürfen.

Getestet werden kann dann mit einem handelsüblichen Browser per:

http://[Deine Domain]/cgi-bin/[Deine Software]

Das ganze sieht dann unter Firefox so aus:

Screenshot von cgi_test_01

Das hat schon mal ganz gut geklappt.

Zweiter Test

Der nächste Schritt sollte eine Website mit farbigen Hintergrund (grün oder rot) sein und ein passend beschrifteter Button, der gedrückt werden kann.

Den farbigen Hintergrund (Startwert ist grün) gebe ich in der Definition des Bodys der generierten html-Seite aus:

printf("Content-type:text/html\n\n<html><body bgcolor=#00FF00>\n");

Die Farbcodes für Webcontent können einfach über Wikipedia zu Farbcodes ermittelt werden.

#00FF00 steht für grün.

Was weiter benötigt wird, ist eine sogenannte Form.

In html wird eine Form, die verschiedene Elemente (Texte, Eingabefelder, Knöpfe etc.) aufnehmen kann, mit dem Befehl <form> eingeleitet und mit dem Befehl </form> abgeschlossen.

Dies muss ich mit printf zu Beginn und zum Ende meiner Einfachsteingabeform (nur ein einziger Knopf) ausgeben:

printf("<form>\n");

Und zum Abschluß der Form:

printf("</form></body></html>\n");

Ein Button, der eine Eingabe zur Statusänderung abschliessen soll, wird in html mit <input type = submit> beschrieben. Ich habe dem Knopf noch mit der Beschriftung “WC-Status setzen” beschriftet:

printf("<input type=\"submit\" value=\"WC-Status setzen\">");

Hier mein kurzer Quelltext in voller Gänze dazu:

//cgi-script in c 
// cgi_test_02

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Content-type:text/html\n\n<html><body bgcolor=#00FF00>\n");  // grün
                                                                         // rot: #FF0000
    printf("<form>\n");
    printf("<input type=\"submit\" value=\"WC-Status setzen\">");
    printf("</form></body></html>\n");
    return 0;
}

Wird dieses Script über einen Browser aufgerufen, dann erhält man folgendes Ergebnis:

Screenshot von cgi_test_02

Also auch das funktioniert ganz gut.

Dritter Test

Nun muss der aktuelle Status der WC-Tür (geschlossen = rot oder geöffnet = grün) in einer Datei auf dem Webserver gespeichert, von der Website (dem Script = Programm natürlich) gelesen, ausgewertet und dargestellt werden und am Ende per Knopf umgeschaltet werden können.

Auf geht’s.